/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 76a6e5a1d02e3ca5f5b8b22798844436349c2620:


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 30  : pager.c,v 1.60
0350: 20 32 30 30 32 2f 31 32 2f 30 32 20 30 34 3a 32   2002/12/02 04:2
0360: 35 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a 2a  5:21 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0420: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0430: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0440: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0450: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0460: 20 20 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b     SQLITE_UNLOCK
0470: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
0480: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
0490: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
04a0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
04c0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
04d0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
04e0: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0500: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0510: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0520: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  state..**.**   S
0550: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20  QLITE_READLOCK  
0560: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0570: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
0580: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
05b0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
05c0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
05f0: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0600: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0610: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0620: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0630: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
0650: 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 20 54 68  _WRITELOCK    Th
0660: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0670: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0680: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
06a0: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
06b0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
06c0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
06f0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0700: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0710: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0720: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0730: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0740: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0750: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 53 51  e comes up in SQ
0760: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  LITE_UNLOCK.  Th
0770: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0780: 2a 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65  * sqlite_page_ge
0790: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
07a0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
07b0: 73 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44  s to SQLITE_READ
07c0: 4c 4f 43 4b 2e 0a 2a 2a 20 41 66 74 65 72 20 61  LOCK..** After a
07d0: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
07e0: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
07f0: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0800: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0810: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0820: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 55  back to SQLITE_U
0830: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0840: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0850: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0860: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0870: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0880: 6f 6e 73 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  ons to.** SQLITE
0890: 5f 57 52 49 54 45 4c 4f 43 4b 2e 20 20 28 4e 6f  _WRITELOCK.  (No
08a0: 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70  te that sqlite_p
08b0: 61 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20  age_write() can 
08c0: 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65  only be.** calle
08d0: 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64  d on an outstand
08e0: 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d  ing page which m
08f0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
0900: 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69  ger must.** be i
0910: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  n SQLITE_READLOC
0920: 4b 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e  K before it tran
0930: 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54  sitions to SQLIT
0940: 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 29 0a 2a 2a  E_WRITELOCK.).**
0950: 20 54 68 65 20 73 71 6c 69 74 65 5f 70 61 67 65   The sqlite_page
0960: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 61 6e 64 20  _rollback() and 
0970: 73 71 6c 69 74 65 5f 70 61 67 65 5f 63 6f 6d 6d  sqlite_page_comm
0980: 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 0a  it() functions .
0990: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ** transition th
09a0: 65 20 73 74 61 74 65 20 66 72 6f 6d 20 53 51 4c  e state from SQL
09b0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 62 61  ITE_WRITELOCK ba
09c0: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41  ck to SQLITE_REA
09d0: 44 4c 4f 43 4b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  DLOCK..*/.#defin
09e0: 65 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  e SQLITE_UNLOCK 
09f0: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53       0.#define S
0a00: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20  QLITE_READLOCK  
0a10: 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    1.#define SQLI
0a20: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 32  TE_WRITELOCK   2
0a30: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  .../*.** Each in
0a40: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
0a50: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
0a60: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
0a70: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
0a80: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
0a90: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
0aa0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
0ab0: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
0ac0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
0ad0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
0ae0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
0af0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
0b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0b10: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
0b20: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
0b30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b50: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
0b60: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
0b70: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
0b80: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
0b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0ba0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
0bb0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
0bc0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
0bd0: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
0be0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
0bf0: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
0c00: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20  r.pgno */.  int 
0c10: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
0c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0c30: 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66  mber of users of
0c40: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
0c50: 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65  PgHdr *pNextFree
0c60: 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f  , *pPrevFree;  /
0c70: 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61  * Freelist of pa
0c80: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
0c90: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  0 */.  PgHdr *pN
0ca0: 65 78 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c  extAll, *pPrevAl
0cb0: 6c 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  l;    /* A list 
0cc0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
0cd0: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 43 6b    PgHdr *pNextCk
0ce0: 70 74 2c 20 2a 70 50 72 65 76 43 6b 70 74 3b 20  pt, *pPrevCkpt; 
0cf0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
0d00: 73 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f  s in the checkpo
0d10: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  int journal */. 
0d20: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
0d50: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
0d60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
0d70: 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20  nCkpt;          
0d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
0d90: 55 45 20 69 66 20 77 72 69 74 74 65 6e 20 74 6f  UE if written to
0da0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
0db0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
0dc0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0de0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
0df0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
0e00: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nges */.  u8 alw
0e10: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
0e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0e30: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
0e40: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
0e50: 65 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45  e */.  /* SQLITE
0e60: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
0e70: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
0e80: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
0e90: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
0ea0: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
0eb0: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
0ec0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
0ed0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  /.};../*.** Conv
0ee0: 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ert a pointer to
0ef0: 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20   a PgHdr into a 
0f00: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64  pointer to its d
0f10: 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20  ata.** and back 
0f20: 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  again..*/.#defin
0f30: 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  e PGHDR_TO_DATA(
0f40: 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50  P)  ((void*)(&(P
0f50: 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44  )[1])).#define D
0f60: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20  ATA_TO_PGHDR(D) 
0f70: 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29   (&((PgHdr*)(D))
0f80: 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  [-1]).#define PG
0f90: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20  HDR_TO_EXTRA(P) 
0fa0: 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a  ((void*)&((char*
0fb0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49  )(&(P)[1]))[SQLI
0fc0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a  TE_PAGE_SIZE])..
0fd0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
0fe0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
0ff0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1000: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1010: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1020: 65 20 6e 75 6d 62 65 72 2e 20 20 4b 6e 75 74 68  e number.  Knuth
1030: 20 73 61 79 73 20 74 68 69 73 20 73 68 6f 75 6c   says this shoul
1040: 64 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d  d be a prime num
1050: 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ber..*/.#define 
1060: 4e 5f 50 47 5f 48 41 53 48 20 32 30 30 33 0a 0a  N_PG_HASH 2003..
1070: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
1080: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
1090: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
10a0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
10b0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
10c0: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
10d0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
10e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1100: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
1110: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1120: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1130: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
1140: 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64    OsFile fd, jfd
1150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1160: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1170: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
1180: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1190: 4f 73 46 69 6c 65 20 63 70 66 64 3b 20 20 20 20  OsFile cpfd;    
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
11c0: 6f 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  or the checkpoin
11d0: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
11e0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
11f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1200: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1210: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
1220: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
1230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
1240: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
1250: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
1260: 2f 0a 20 20 69 6e 74 20 63 6b 70 74 53 69 7a 65  /.  int ckptSize
1270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1280: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
1290: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
12a0: 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a  t ckpt_begin() *
12b0: 2f 0a 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a 53  /.  off_t ckptJS
12c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
12d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
12e0: 61 6c 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e  al at ckpt_begin
12f0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  () */.  int nExt
1300: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
1310: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
1320: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
1330: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1340: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
1350: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
1360: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
1370: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
1380: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
1390: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
13c0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
13d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
1400: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
1410: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
1420: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
1450: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
1460: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
1470: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
1480: 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20  , nOvfl;     /* 
1490: 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  Cache hits, miss
14a0: 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65  ing, and LRU ove
14b0: 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 75 38 20 6a  rflows */.  u8 j
14c0: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
14d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14e0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
14f0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
1500: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  alid */.  u8 use
1510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1520: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1530: 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  use a rollback j
1540: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
1550: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ile */.  u8 ckpt
1560: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
1570: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1580: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1590: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
15a0: 2f 0a 20 20 75 38 20 63 6b 70 74 49 6e 55 73 65  /.  u8 ckptInUse
15b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15c0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
15d0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  n a checkpoint *
15e0: 2f 0a 20 20 75 38 20 63 6b 70 74 41 75 74 6f 6f  /.  u8 ckptAutoo
15f0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
1600: 2f 2a 20 4f 70 65 6e 20 63 6b 70 74 20 6a 6f 75  /* Open ckpt jou
1610: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
1620: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
1630: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
1660: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
1670: 72 75 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  rue */.  u8 stat
1680: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1690: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55       /* SQLITE_U
16a0: 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b  NLOCK, _READLOCK
16b0: 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a   or _WRITELOCK *
16c0: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
16f0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
1700: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
1710: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1720: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1730: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
1740: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
1750: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
1760: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1770: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1780: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
1790: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
17a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17b0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
17c0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
17d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
17e0: 72 74 79 46 69 6c 65 3b 20 20 20 20 20 20 20 20  rtyFile;        
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1800: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
1810: 68 61 73 20 63 68 61 6e 67 65 64 20 69 6e 20 61  has changed in a
1820: 6e 79 20 77 61 79 20 2a 2f 0a 20 20 75 38 20 61  ny way */.  u8 a
1830: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1840: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1850: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1860: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
1870: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1880: 46 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 20 20  Format;         
1890: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 20 6e 75 6d    /* Version num
18a0: 62 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ber of the journ
18b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  al file */.  u8 
18c0: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
18e0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
18f0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1900: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
1910: 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20 20 20  aInCkpt;        
1920: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
1930: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
1940: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1950: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
1960: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
1970: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
1980: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
1990: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
19a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
19b0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
19c0: 0a 20 20 50 67 48 64 72 20 2a 70 43 6b 70 74 3b  .  PgHdr *pCkpt;
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e0: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
19f0: 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  in the checkpoin
1a00: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50  t journal */.  P
1a10: 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47  gHdr *aHash[N_PG
1a20: 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61  _HASH];    /* Ha
1a30: 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20  sh table to map 
1a40: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50  page number of P
1a50: 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  gHdr */.};../*.*
1a60: 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74 73  * These are bits
1a70: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74   that can be set
1a80: 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73   in Pager.errMas
1a90: 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  k..*/.#define PA
1aa0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20  GER_ERR_FULL    
1ab0: 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74   0x01  /* a writ
1ac0: 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  e() failed */.#d
1ad0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
1ae0: 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f  MEM      0x02  /
1af0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  * malloc() faile
1b00: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
1b10: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20  ER_ERR_LOCK     
1b20: 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69  0x04  /* error i
1b30: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  n the locking pr
1b40: 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e  otocol */.#defin
1b50: 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  e PAGER_ERR_CORR
1b60: 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61  UPT  0x08  /* da
1b70: 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61  tabase or journa
1b80: 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  l corruption */.
1b90: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1ba0: 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30 20  R_DISK     0x10 
1bb0: 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b   /* general disk
1bc0: 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64   I/O error - bad
1bd0: 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a   hard drive? */.
1be0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
1bf0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
1c00: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e   page records in
1c10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1c20: 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70  * format..*/.typ
1c30: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
1c40: 52 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72  Record PageRecor
1c50: 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65  d;.struct PageRe
1c60: 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67  cord {.  Pgno pg
1c70: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1c80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1c90: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1ca0: 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54  char aData[SQLIT
1cb0: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  E_PAGE_SIZE];  /
1cc0: 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  * Original data 
1cd0: 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f  for page pgno */
1ce0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  .};../*.** Journ
1cf0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
1d00: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1d10: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
1d20: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
1d30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
1d40: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
1d50: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
1d60: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
1d70: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
1d80: 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  two journal form
1d90: 61 74 73 2e 20 20 54 68 65 20 6f 6c 64 65 72 20  ats.  The older 
1da0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77  journal format w
1db0: 72 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20  rites.** 32-bit 
1dc0: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
1dd0: 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
1de0: 65 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20  e host machine. 
1df0: 20 54 68 65 20 6e 65 77 0a 2a 2a 20 66 6f 72 6d   The new.** form
1e00: 61 74 20 77 72 69 74 65 73 20 69 6e 74 65 67 65  at writes intege
1e10: 72 73 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  rs as big-endian
1e20: 2e 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e  .  All new journ
1e30: 61 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e  als use the.** n
1e40: 65 77 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77  ew format, but w
1e50: 65 20 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c  e have to be abl
1e60: 65 20 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64  e to read an old
1e70: 65 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72  er journal in or
1e80: 64 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 69  der.** to roll i
1e90: 74 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t back..*/.stati
1ea0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1eb0: 20 63 68 61 72 20 61 4f 6c 64 4a 6f 75 72 6e 61   char aOldJourna
1ec0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
1ed0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
1ee0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
1ef0: 31 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d  1, 0x63, 0xd4,.}
1f00: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  ;.static const u
1f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
1f20: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
1f30: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
1f40: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
1f50: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
1f60: 35 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 51  5,.};.#define SQ
1f70: 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c  LITE_NEW_JOURNAL
1f80: 5f 46 4f 52 4d 41 54 20 31 0a 23 64 65 66 69 6e  _FORMAT 1.#defin
1f90: 65 20 53 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55  e SQLITE_OLD_JOU
1fa0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 20 30 0a 0a 2f  RNAL_FORMAT 0../
1fb0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1fc0: 6e 67 20 69 6e 74 65 67 65 72 2c 20 69 66 20 73  ng integer, if s
1fd0: 65 74 2c 20 63 61 75 73 65 73 20 6a 6f 75 72 6e  et, causes journ
1fe0: 61 6c 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  als to be writte
1ff0: 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 6f 6c 64 20  n in the.** old 
2000: 66 6f 72 6d 61 74 2e 20 20 54 68 69 73 20 69 73  format.  This is
2010: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2020: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20  g purposes only 
2030: 2d 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 2a  - to make sure.*
2040: 2a 20 74 68 65 20 63 6f 64 65 20 69 73 20 61 62  * the code is ab
2050: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  le to rollback a
2060: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n old journal..*
2070: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2080: 54 45 53 54 0a 69 6e 74 20 70 61 67 65 72 5f 6f  TEST.int pager_o
2090: 6c 64 5f 66 6f 72 6d 61 74 20 3d 20 30 3b 0a 23  ld_format = 0;.#
20a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
20b0: 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 30  ger_old_format 0
20c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
20d0: 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ash a page numbe
20e0: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67  r.*/.#define pag
20f0: 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50  er_hash(PN)  ((P
2100: 4e 29 25 4e 5f 50 47 5f 48 41 53 48 29 0a 0a 2f  N)%N_PG_HASH)../
2110: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
2120: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
2130: 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  king here:.*/.#i
2140: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2150: 0a 20 20 69 6e 74 20 70 61 67 65 72 5f 72 65 66  .  int pager_ref
2160: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b  info_enable = 0;
2170: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
2180: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48  ager_refinfo(PgH
2190: 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74  dr *p){.    stat
21a0: 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  ic int cnt = 0;.
21b0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 5f 72      if( !pager_r
21c0: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
21d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e  return;.    prin
21e0: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
21f0: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25  NT: %4d addr=0x%
2200: 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  08x nRef=%d\n",.
2210: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
2220: 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
2230: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
2240: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
2250: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
2260: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
2270: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
2280: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
2290: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
22a0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
22b0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
22c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
22d0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
22e0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
22f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
2310: 65 61 64 33 32 62 69 74 73 28 50 61 67 65 72 20  ead32bits(Pager 
2320: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
2330: 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  *fd, u32 *pRes){
2340: 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e  .  u32 res;.  in
2350: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
2360: 69 74 65 4f 73 52 65 61 64 28 66 64 2c 20 26 72  iteOsRead(fd, &r
2370: 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29  es, sizeof(res))
2380: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2390: 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
23a0: 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 3d 3d  >journalFormat==
23b0: 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e  SQLITE_NEW_JOURN
23c0: 41 4c 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20  AL_FORMAT ){.   
23d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
23e0: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
23f0: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
2400: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
2410: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
2420: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
2430: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
2440: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
2450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2460: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
2470: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
2480: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
2490: 63 72 69 70 74 6f 72 2e 20 20 57 72 69 74 69 6e  criptor.  Writin
24a0: 67 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 64  g.** is always d
24b0: 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 6e 65  one using the ne
24c0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
24d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24e0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
24f0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
2500: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
2510: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 66 28 20 70  r ac[4];.  if( p
2520: 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20  ager_old_format 
2530: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
2540: 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64 2c 20  liteOsWrite(fd, 
2550: 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  &val, 4);.  }.  
2560: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
2570: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
2580: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
2590: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
25a0: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
25b0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
25c0: 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   0xff;.  return 
25d0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64  sqliteOsWrite(fd
25e0: 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 0a 2f 2a  , ac, 4);.}.../*
25f0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
2600: 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67  bits in the pPag
2610: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f  er->errMask into
2620: 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a   an approprate.*
2630: 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a  * return code..*
2640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2650: 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72  er_errcode(Pager
2660: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2670: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2680: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2690: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
26a0: 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20  RR_LOCK )    rc 
26b0: 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  = SQLITE_PROTOCO
26c0: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
26d0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
26e0: 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72  _ERR_DISK )    r
26f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2710: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
2720: 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63  ERR_FULL )    rc
2730: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
2740: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2750: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
2760: 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d  R_MEM )     rc =
2770: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2780: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2790: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
27a0: 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20  _CORRUPT ) rc = 
27b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
27c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27d0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
27e0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
27f0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
2800: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
2810: 6e 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  n the.** checkpo
2820: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
2830: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
2840: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
2850: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
2860: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2870: 6e 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 70 6f  n.** the checkpo
2880: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  int journal.  Th
2890: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
28a0: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f  itepager_ckpt_co
28b0: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
28c0: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
28d0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
28e0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
28f0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
2900: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
2910: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
2920: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
2930: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
2940: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
2950: 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74  add_to_ckpt_list
2960: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2970: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2980: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2990: 66 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29  f( pPg->inCkpt )
29a0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
29b0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70  t( pPg->pPrevCkp
29c0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
29d0: 78 74 43 6b 70 74 3d 3d 30 20 29 3b 0a 20 20 70  xtCkpt==0 );.  p
29e0: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20  Pg->pPrevCkpt = 
29f0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
2a00: 3e 70 43 6b 70 74 20 29 7b 0a 20 20 20 20 70 50  >pCkpt ){.    pP
2a10: 61 67 65 72 2d 3e 70 43 6b 70 74 2d 3e 70 50 72  ager->pCkpt->pPr
2a20: 65 76 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20  evCkpt = pPg;.  
2a30: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  }.  pPg->pNextCk
2a40: 70 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 43 6b  pt = pPager->pCk
2a50: 70 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  pt;.  pPager->pC
2a60: 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  kpt = pPg;.  pPg
2a70: 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 7d 0a  ->inCkpt = 1;.}.
2a80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
2a90: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70  _remove_from_ckp
2aa0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
2ab0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
2ac0: 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b  inCkpt ) return;
2ad0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
2ae0: 76 43 6b 70 74 20 29 7b 0a 20 20 20 20 61 73 73  vCkpt ){.    ass
2af0: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43  ert( pPg->pPrevC
2b00: 6b 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d  kpt->pNextCkpt==
2b10: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
2b20: 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74  pPrevCkpt->pNext
2b30: 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Ckpt = pPg->pNex
2b40: 74 43 6b 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tCkpt;.  }else{.
2b50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2b60: 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3d 3d  >pPager->pCkpt==
2b70: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
2b80: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20  pPager->pCkpt = 
2b90: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a  pPg->pNextCkpt;.
2ba0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
2bb0: 4e 65 78 74 43 6b 70 74 20 29 7b 0a 20 20 20 20  NextCkpt ){.    
2bc0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
2bd0: 78 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70  xtCkpt->pPrevCkp
2be0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
2bf0: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50  g->pNextCkpt->pP
2c00: 72 65 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70  revCkpt = pPg->p
2c10: 50 72 65 76 43 6b 70 74 3b 0a 20 20 7d 0a 20 20  PrevCkpt;.  }.  
2c20: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d  pPg->pNextCkpt =
2c30: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
2c40: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Ckpt = 0;.  pPg-
2c50: 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 7d 0a 0a  >inCkpt = 0;.}..
2c60: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
2c70: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
2c80: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
2c90: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
2ca0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
2cb0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
2cc0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
2ce0: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
2cf0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
2d00: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
2d10: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
2d20: 61 48 61 73 68 5b 70 67 6e 6f 20 25 20 4e 5f 50  aHash[pgno % N_P
2d30: 47 5f 48 41 53 48 5d 3b 0a 20 20 77 68 69 6c 65  G_HASH];.  while
2d40: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
2d50: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
2d60: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
2d70: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2d80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
2d90: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
2da0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
2db0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
2dc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
2dd0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
2de0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
2df0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
2e00: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
2e10: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
2e20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
2e30: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
2e40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
2e50: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
2e60: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
2e70: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
2e80: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
2e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ea0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
2eb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
2ec0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
2ed0: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
2ee0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
2ef0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
2f00: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
2f10: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
2f20: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
2f30: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
2f40: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
2f50: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
2f60: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
2f70: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2f80: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2f90: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2fa0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
2fb0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
2fc0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49  ger->state>=SQLI
2fd0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a  TE_WRITELOCK ){.
2fe0: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
2ff0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
3000: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
3010: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
3020: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  fd);.  pPager->s
3030: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
3040: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
3050: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
3060: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
3070: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3080: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
3090: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
30a0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
30b0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
30c0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
30d0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
30e0: 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f  nd.** a write lo
30f0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
3100: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
3110: 65 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64  e releases the d
3120: 61 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65  atabase.** write
3130: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
3140: 65 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  es a read lock i
3150: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
3160: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
3170: 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  * is deleted and
3180: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
3190: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
31a0: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
31b0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31c0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
31d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
31e0: 74 61 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54  tate<SQLITE_WRIT
31f0: 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53  ELOCK ) return S
3200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
3210: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
3220: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
3230: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f  f( pPager->ckptO
3240: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
3250: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
3260: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 70 50 61  ->cpfd);.    pPa
3270: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
3280: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
3290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
32a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
32b0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
32c0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
32d0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
32e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 44 65  ;.    sqliteOsDe
32f0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
3300: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
3310: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
3320: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
3330: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
3340: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
3350: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
3360: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
3370: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
3380: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
3390: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
33a0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
33b0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
33c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33d0: 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20  dirtyFile==0 || 
33e0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
33f0: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72  al==0 );.  }.  r
3400: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
3410: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
3420: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
3430: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
3440: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
3450: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
3460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
3470: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
3480: 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65 73 73  pen if a process
3490: 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c 20 74   does a BEGIN, t
34a0: 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20 74 68  hen forks and th
34b0: 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
34c0: 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68 65 20  rocess does the 
34d0: 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75 73 65  COMMIT.  Because
34e0: 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74 69 63   of the semantic
34f0: 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a  s of unix.    **
3500: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74   file locking, t
3510: 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66  he unlock will f
3520: 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ail..    */.    
3530: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
3540: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
3550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3560: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
3570: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
3580: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3590: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
35a0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
35b0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
35c0: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  is one page..*/.
35d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35e0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
35f0: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
3600: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 29 7b 0a  , OsFile *jfd){.
3610: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
3620: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
3630: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
3640: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
3650: 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52  cache */.  PageR
3660: 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 0a 20 20  ecord pgRec;..  
3670: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
3680: 70 50 61 67 65 72 2c 20 6a 66 64 2c 20 26 70 67  pPager, jfd, &pg
3690: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Rec.pgno);.  if(
36a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
36c0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
36d0: 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74  jfd, &pgRec.aDat
36e0: 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e  a, sizeof(pgRec.
36f0: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72  aData));.  if( r
3700: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3710: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
3720: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
3730: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
3740: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
3750: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
3760: 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  | pgRec.pgno==0 
3770: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
3780: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20 50  CORRUPT;..  /* P
3790: 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61 67 65  layback the page
37a0: 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  .  Update the in
37b0: 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20  -memory copy of 
37c0: 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74  the page.  ** at
37d0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
37e0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
37f0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
3800: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
3810: 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  r, pgRec.pgno);.
3820: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
3830: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
3840: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65  _DATA(pPg), pgRe
3850: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
3860: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
3870: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
3880: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
3890: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
38a0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
38b0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
38c0: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
38d0: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
38e0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
38f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3900: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
3910: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
3920: 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61  ger->fd, pgRec.a
3930: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
3940: 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 72  E_SIZE);.  }.  r
3950: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3960: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
3970: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
3980: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
3990: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
39a0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
39b0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
39c0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
39d0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
39e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
39f0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
3a00: 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73 20  lows:  There is 
3a10: 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66 69  an initial.** fi
3a20: 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20 66  le-type string f
3a30: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
3a40: 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65 20  ng.  Then there 
3a50: 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 50  is a single.** P
3a60: 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63 68  gno number which
3a70: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
3a80: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3a90: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
3aa0: 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 6d  * changes were m
3ab0: 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62 61  ade.  The databa
3ac0: 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  se is truncated 
3ad0: 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a 2a  to this size..**
3ae0: 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f 20   Next come zero 
3af0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65 63  or more page rec
3b00: 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68 20  ords where each 
3b10: 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20 63  page record.** c
3b20: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67 6e  onsists of a Pgn
3b30: 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41 47  o and SQLITE_PAG
3b40: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
3b50: 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74 68  data.  See.** th
3b60: 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74 72  e PageRecord str
3b70: 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61 69  ucture for detai
3b80: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ls..**.** If the
3b90: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
3ba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3bb0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
3bc0: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
3bd0: 20 66 69 6c 65 20 28 61 73 20 64 65 74 65 72 6d   file (as determ
3be0: 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  ined by looking 
3bf0: 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e 75 6d  at the magic num
3c00: 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  ber.** at the be
3c10: 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74 68  ginning) then th
3c20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
3c30: 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  ns SQLITE_PROTOC
3c40: 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74  OL..** If any ot
3c50: 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63 75 72  her errors occur
3c60: 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61 63 6b   during playback
3c70: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  , the database w
3c80: 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62 65  ill.** likely be
3c90: 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74   corrupted, so t
3ca0: 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  he PAGER_ERR_COR
3cb0: 52 55 50 54 20 62 69 74 20 69 73 20 73 65 74 20  RUPT bit is set 
3cc0: 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65 72  in.** pPager->er
3cd0: 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49 54 45  rMask and SQLITE
3ce0: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
3cf0: 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c  rned.  If it all
3d00: 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20  .** works, then 
3d10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
3d20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
3d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3d40: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
3d50: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
3d60: 66 66 5f 74 20 6e 52 65 63 3b 20 20 20 20 20 20  ff_t nRec;      
3d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d80: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
3d90: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
3da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3db0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
3dc0: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3de0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
3df0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
3e00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
3e10: 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28  r aMagic[sizeof(
3e20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 3b  aJournalMagic)];
3e30: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
3e40: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
3e50: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
3e60: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
3e70: 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
3e80: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
3e90: 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
3ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
3ec0: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  ;.  sqliteOsSeek
3ed0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  (&pPager->jfd, 0
3ee0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3ef0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
3f00: 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b  er->jfd, &nRec);
3f10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3f20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
3f30: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
3f40: 20 7d 0a 20 20 69 66 28 20 6e 52 65 63 20 3c 3d   }.  if( nRec <=
3f50: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b   sizeof(aMagic)+
3f60: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a  sizeof(Pgno) ){.
3f70: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
3f80: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
3f90: 63 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a  c = (nRec - (siz
3fa0: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
3fb0: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
3fc0: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
3fd0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
3fe0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
3ff0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75   journal and tru
4000: 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64  ncate the.  ** d
4010: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
4020: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
4030: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
4040: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
4050: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
4060: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
4070: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
4080: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4090: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
40a0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
40b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
40c0: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
40d0: 28 61 4d 61 67 69 63 2c 20 61 4f 6c 64 4a 6f 75  (aMagic, aOldJou
40e0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
40f0: 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b  f(aMagic))==0 ){
4100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
4110: 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c  rnalFormat = SQL
4120: 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f  ITE_OLD_JOURNAL_
4130: 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 20  FORMAT;.  }else 
4140: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
4150: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
4160: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
4170: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  )==0 ){.    pPag
4180: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61  er->journalForma
4190: 74 20 3d 20 53 51 4c 49 54 45 5f 4e 45 57 5f 4a  t = SQLITE_NEW_J
41a0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20  OURNAL_FORMAT;. 
41b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
41c0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
41d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
41e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
41f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
4200: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
4210: 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69  jfd, &mxPg);.  i
4220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4230: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
4240: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
4250: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
4260: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
4270: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
4280: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67  SIZE*(off_t)mxPg
4290: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
42a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
42b0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
42c0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
42d0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
42e0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
42f0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
4300: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
4310: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
4320: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
4330: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
4340: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4350: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
4360: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
4370: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
4380: 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  >jfd);.    if( r
4390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
43a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70  reak;.  }..end_p
43b0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
43c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
43d0: 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74      pager_unwrit
43e0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
43f0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
4400: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
4410: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  CORRUPT;.    rc 
4420: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4440: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
4450: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
4460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4470: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
4480: 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  k the checkpoint
4490: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
44a0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
44b0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
44c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
44d0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
44e0: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
44f0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
4500: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
4510: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
4530: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
4540: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 63 68  *         the ch
4550: 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f 72  eckpoint is stor
4560: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63 6b  ed in pPager->ck
4570: 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  ptSize, not in t
4580: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
4590: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
45a0: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
45b0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
45c0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
45d0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
45e0: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
45f0: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
4600: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
4610: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
4620: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
4630: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
4640: 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53  t pPager->ckptJS
4650: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
4660: 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c  nt pager_ckpt_pl
4670: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
4680: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e  ager){.  off_t n
4690: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
46a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
46b0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
46c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
46d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
46e0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
46f0: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
4700: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
4710: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
4720: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
4730: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75  rc = sqliteOsTru
4740: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
4750: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
4760: 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65  IZE*(off_t)pPage
4770: 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20  r->ckptSize);.  
4780: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
4790: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
47a0: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
47b0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
47c0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
47d0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
47e0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
47f0: 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  t( pPager->ckptI
4800: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
4810: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
4820: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
4830: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
4840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
4850: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
4860: 2d 3e 63 70 66 64 2c 20 26 6e 52 65 63 29 3b 0a  ->cpfd, &nRec);.
4870: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
4890: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
48a0: 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 2f 3d  k;.  }.  nRec /=
48b0: 20 73 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f   sizeof(PageReco
48c0: 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  rd);.  .  /* Cop
48d0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
48e0: 20 6f 75 74 20 6f 66 20 74 68 65 20 63 68 65 63   out of the chec
48f0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  kpoint journal a
4900: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
4910: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
4920: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
4930: 70 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74  pager_old_format
4940: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4950: 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20  journalFormat = 
4960: 53 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e  SQLITE_OLD_JOURN
4970: 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c  AL_FORMAT;.  }el
4980: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
4990: 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20  journalFormat = 
49a0: 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e  SQLITE_NEW_JOURN
49b0: 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20  AL_FORMAT;.  }. 
49c0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
49d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
49e0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
49f0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
4a00: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  er, &pPager->cpf
4a10: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
4a20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
4a30: 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61   end_ckpt_playba
4a40: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ck;.  }..  /* Fi
4a50: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
4a60: 79 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  y pages need to 
4a70: 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  be copied out of
4a80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4a90: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20  .  ** journal.. 
4aa0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
4ab0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
4ac0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b  >jfd, pPager->ck
4ad0: 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ptJSize);.  if( 
4ae0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4af0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  .    goto end_ck
4b00: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
4b10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
4b20: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
4b30: 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  ->jfd, &nRec);. 
4b40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4b50: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
4b60: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
4b70: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
4b80: 6e 52 65 63 20 2d 20 70 50 61 67 65 72 2d 3e 63  nRec - pPager->c
4b90: 6b 70 74 4a 53 69 7a 65 29 2f 73 69 7a 65 6f 66  kptJSize)/sizeof
4ba0: 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20  (PageRecord);.  
4bb0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
4bc0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
4bd0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
4be0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
4bf0: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  r, &pPager->jfd)
4c00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
4c10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
4c20: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
4c30: 3b 0a 20 20 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b  ;.  }.  ..end_ck
4c40: 70 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  pt_playback:.  i
4c50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4c60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4c70: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
4c80: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
4c90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
4ca0: 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  RRUPT;.  }.  ret
4cb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4cc0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
4cd0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
4ce0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
4cf0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
4d00: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
4d10: 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  m number is the 
4d20: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
4d30: 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72  f the mxPage par
4d40: 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78  ameter..** If mx
4d50: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
4d60: 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61  , the noSync fla
4d70: 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20  g is also set.  
4d80: 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a  noSync bypasses.
4d90: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
4da0: 74 65 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65  teOsSync().  The
4db0: 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68   pager runs much
4dc0: 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53   faster with noS
4dd0: 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69  ync on,.** but i
4de0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
4df0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
4e00: 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62  r there is an ab
4e10: 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66  rupt power .** f
4e20: 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61  ailure, the data
4e30: 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20  base file might 
4e40: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
4e50: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a  consistent and.*
4e60: 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73  * unrepairable s
4e70: 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tate.  .*/.void 
4e80: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f  sqlitepager_set_
4e90: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
4ea0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
4eb0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
4ec0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
4ed0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
4ee0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
4ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
4f00: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
4f10: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
4f20: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
4f30: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
4f40: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
4f50: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d   = mxPage;.  }.}
4f60: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
4f70: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
4f80: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
4f90: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
4fa0: 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20  zName.** (zName 
4fb0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
4fc0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
4fd0: 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67  _SIZE bytes long
4fe0: 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  .)  Write.** the
4ff0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5000: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
5010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5020: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
5030: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
5040: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
5050: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
5060: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5070: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
5080: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
5090: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
50b0: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
50c0: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
50d0: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
50e0: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
50f0: 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  t rc;.  do{.    
5100: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
5110: 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  eOsTempFileName(
5120: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
5130: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63   sqliteOsOpenExc
5140: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
5150: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
5160: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
5170: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
5180: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5190: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
51a0: 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
51b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
51c0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
51d0: 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
51e0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
51f0: 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
5200: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
5210: 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
5220: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
5230: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
5240: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
5250: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
5260: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
5270: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
5280: 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65  using sqlitepage
5290: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  r_unref()..**.**
52a0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
52b0: 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
52c0: 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
52d0: 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
52e0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
52f0: 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
5300: 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
5310: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
5320: 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
5330: 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
5340: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
5350: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
5360: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
5370: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
5380: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
5390: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
53a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
53b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
53c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
53d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
53e0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  pen */.  int mxP
53f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
5400: 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20    /* Max number 
5410: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  of in-memory cac
5420: 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  he pages */.  in
5430: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
5440: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5450: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
5460: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
5470: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  age */.  int use
5480: 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20  Journal         
5490: 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65    /* TRUE to use
54a0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
54b0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
54c0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
54d0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 6e 61  pPager;.  int na
54e0: 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20  meLen;.  OsFile 
54f0: 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fd;.  int rc;.  
5500: 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  int tempFile;.  
5510: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
5520: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
5530: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
5540: 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65  IZE];..  *ppPage
5550: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
5560: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
5570: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
5580: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5590: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
55a0: 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
55b0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
55c0: 69 74 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  ite(zFilename, &
55d0: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
55e0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30      tempFile = 0
55f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5600: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
5610: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
5620: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
5630: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
5640: 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
5650: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
5660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
5670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
5680: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  OPEN;.  }.  name
5690: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  Len = strlen(zFi
56a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  lename);.  pPage
56b0: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
56c0: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
56d0: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20  ) + nameLen*2 + 
56e0: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
56f0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
5700: 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  iteOsClose(&fd);
5710: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5720: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5730: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
5740: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
5750: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
5760: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
5770: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
5780: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
5790: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
57a0: 65 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  ename, zFilename
57b0: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
57c0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
57d0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  ilename);.  strc
57e0: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
57f0: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
5800: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
5810: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
5820: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5830: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
5840: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
5850: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70   useJournal;.  p
5860: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
5870: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  = 0;.  pPager->c
5880: 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  kptInUse = 0;.  
5890: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
58a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
58b0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
58c0: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b  r->ckptSize = 0;
58d0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  .  pPager->ckptJ
58e0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
58f0: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
5900: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
5910: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
5920: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
5930: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
5940: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
5950: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
5960: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
5970: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
5980: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
5990: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
59a0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
59b0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
59c0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
59d0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
59e0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
59f0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
5a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
5a10: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
5a20: 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61  >nExtra = nExtra
5a30: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
5a40: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
5a50: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
5a60: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
5a70: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
5a80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5a90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
5aa0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
5ab0: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
5ac0: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74  t NULL, the dest
5ad0: 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64  ructor is called
5ae0: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66  .** when the ref
5af0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
5b00: 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65  each page reache
5b10: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73  s zero.  The des
5b20: 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62  tructor can.** b
5b30: 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  e used to clean 
5b40: 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  up information i
5b50: 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d  n the extra segm
5b60: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
5b70: 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  each page..**.**
5b80: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
5b90: 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73  is not called as
5ba0: 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65   a result sqlite
5bb0: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
5bc0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
5bd0: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
5be0: 62 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  by sqlitepager_u
5bf0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
5c00: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f  sqlitepager_set_
5c10: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
5c20: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
5c30: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29 7b  *xDesc)(void*)){
5c40: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
5c50: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
5c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5c70: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
5c80: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
5c90: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
5ca0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
5cb0: 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
5cc0: 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75  itepager_pagecou
5cd0: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
5ce0: 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20  ){.  off_t n;.  
5cf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
5d00: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
5d10: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
5d20: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
5d30: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
5d40: 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c   if( sqliteOsFil
5d50: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
5d60: 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f  d, &n)!=SQLITE_O
5d70: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
5d80: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
5d90: 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20  R_ERR_DISK;.    
5da0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5db0: 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45  n /= SQLITE_PAGE
5dc0: 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50 61  _SIZE;.  if( pPa
5dd0: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
5de0: 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  TE_UNLOCK ){.   
5df0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
5e00: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
5e10: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  n n;.}../*.** Sh
5e20: 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
5e30: 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
5e40: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
5e50: 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
5e60: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
5e70: 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
5e80: 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
5e90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
5ea0: 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
5eb0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
5ec0: 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
5ed0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
5ee0: 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
5ef0: 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
5f00: 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
5f10: 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
5f20: 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
5f30: 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
5f40: 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
5f50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
5f60: 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
5f70: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
5f80: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20  oredump..*/.int 
5f90: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
5fa0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5fb0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
5fc0: 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68  *pNext;.  switch
5fd0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
5fe0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
5ff0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a  TE_WRITELOCK: {.
6000: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
6010: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
6020: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
6030: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
6040: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
6050: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
6060: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
6070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6080: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
6090: 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20  E_READLOCK: {.  
60a0: 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f      sqliteOsUnlo
60b0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
60c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
60d0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
60e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
60f0: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
6100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6110: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6120: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6130: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
6140: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
6150: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
6160: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
6170: 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70  sqliteOsClose(&p
6180: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73  Pager->fd);.  as
6190: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
61a0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
61b0: 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
61c0: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
61d0: 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
61e0: 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
61f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
6200: 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73  .  **   sqliteOs
6210: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
6220: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
6230: 7d 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  }.  */.  sqliteF
6240: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
6250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6270: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
6280: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
6290: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
62a0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61  o sqlitepager_pa
62b0: 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
62c0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
62d0: 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
62e0: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
62f0: 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
6300: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
6310: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
6320: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
6330: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  If the page is.*
6340: 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  * currently on t
6350: 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
6360: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6370: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
6380: 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
6390: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
63a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
63b0: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
63c0: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
63d0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
63e0: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
63f0: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
6400: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
6410: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
6420: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
6430: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
6440: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
6450: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
6460: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
6470: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
6480: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
6490: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a  NextFree;.    }.
64a0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
64b0: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
64c0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
64d0: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
64e0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
64f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
6500: 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  ->pPager->pLast 
6510: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
6520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
6530: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
6540: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
6550: 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  ++;.  REFINFO(pP
6560: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  g);.}../*.** Inc
6570: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
6580: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
6590: 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
65a0: 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
65b0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
65c0: 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
65d0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
65e0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
65f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
6600: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
6610: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
6620: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
6630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6640: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
6650: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20  ournal and then 
6660: 77 72 69 74 65 20 61 6c 6c 20 66 72 65 65 20 64  write all free d
6670: 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
6680: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
6690: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e  le..**.** Writin
66a0: 67 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79  g all free dirty
66b0: 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
66c0: 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68 65  tabase after the
66d0: 20 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f   sync is a.** no
66e0: 6e 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d 69  n-obvious optimi
66f0: 7a 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29  zation.  fsync()
6700: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
6710: 20 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20 77 65   operation so we
6720: 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69  .** want to mini
6730: 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mize the number 
6740: 6f 74 20 74 69 6d 65 73 20 69 74 20 69 73 20 63  ot times it is c
6750: 61 6c 6c 65 64 2e 20 41 66 74 65 72 20 61 6e 20  alled. After an 
6760: 66 73 79 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a  fsync() call,.**
6770: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
6780: 77 72 69 74 65 20 64 69 72 74 79 20 70 61 67 65  write dirty page
6790: 73 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  s back to the da
67a0: 74 61 62 61 73 65 2e 20 20 49 74 20 69 73 20 62  tabase.  It is b
67b0: 65 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  est.** to go ahe
67c0: 61 64 20 61 6e 64 20 77 72 69 74 65 20 61 73 20  ad and write as 
67d0: 6d 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73  many dirty pages
67e0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   as possible to 
67f0: 6d 69 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65  minimize .** the
6800: 20 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20   risk of having 
6810: 74 6f 20 64 6f 20 61 6e 6f 74 68 65 72 20 66 73  to do another fs
6820: 79 6e 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20  ync() later on. 
6830: 20 57 72 69 74 69 6e 67 20 64 69 72 74 79 0a 2a   Writing dirty.*
6840: 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 6e 20  * free pages in 
6850: 74 68 69 73 20 77 61 79 20 77 61 73 20 6f 62 73  this way was obs
6860: 65 72 76 65 64 20 74 6f 20 6d 61 6b 65 20 64 61  erved to make da
6870: 74 61 62 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  tabase operation
6880: 73 20 67 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30  s go.** up to 10
6890: 20 74 69 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a   times faster..*
68a0: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 77  *.** If we are w
68b0: 72 69 74 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72  riting to tempor
68c0: 61 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ary database, th
68d0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
68e0: 6f 20 70 72 65 73 65 72 76 65 0a 2a 2a 20 74 68  o preserve.** th
68f0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
6900: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
6910: 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
6920: 74 69 6d 65 20 61 6e 64 20 73 6b 69 70 20 74 68  time and skip th
6930: 65 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f  e.** fsync()..*/
6940: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
6950: 41 6c 6c 50 61 67 65 73 28 50 61 67 65 72 20 2a  AllPages(Pager *
6960: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
6970: 20 2a 70 50 67 3b 0a 20 20 50 67 6e 6f 20 6c 61   *pPg;.  Pgno la
6980: 73 74 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  stPgno;.  int rc
6990: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
69a0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
69b0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
69c0: 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
69d0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
69e0: 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
69f0: 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
6a00: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
6a10: 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
6a20: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
6a30: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
6a40: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
6a50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6a60: 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
6a70: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
6a80: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
6a90: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
6aa0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
6ab0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
6ac0: 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
6ad0: 66 72 65 65 20 70 61 67 65 73 20 74 6f 20 74 68  free pages to th
6ae0: 65 20 64 69 73 6b 20 69 6e 20 74 68 65 20 6f 72  e disk in the or
6af0: 64 65 72 20 74 68 61 74 20 74 68 65 79 0a 20 20  der that they.  
6b00: 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
6b10: 20 64 69 73 6b 2e 20 20 57 65 20 68 61 76 65 20   disk.  We have 
6b20: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
6b30: 68 20 73 6f 72 74 69 6e 67 20 74 68 65 20 70 61  h sorting the pa
6b40: 67 65 73 0a 20 20 2a 2a 20 62 79 20 70 61 67 65  ges.  ** by page
6b50: 20 6e 75 6d 62 65 72 73 20 73 6f 20 74 68 61 74   numbers so that
6b60: 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
6b70: 6e 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74 20  n in order, but 
6b80: 74 68 61 74 20 64 6f 65 73 0a 20 20 2a 2a 20 6e  that does.  ** n
6b90: 6f 74 20 61 70 70 65 61 72 20 74 6f 20 69 6d 70  ot appear to imp
6ba0: 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
6bb0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 67  ..  */.  for(pPg
6bc0: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b  =pPager->pFirst;
6bd0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
6be0: 4e 65 78 74 46 72 65 65 29 7b 0a 20 20 20 20 69  NextFree){.    i
6bf0: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
6c00: 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 50  .      if( lastP
6c10: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  gno==0 || pPg->p
6c20: 67 6e 6f 21 3d 6c 61 73 74 50 67 6e 6f 2b 31 20  gno!=lastPgno+1 
6c30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6c40: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
6c50: 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d  >fd, (pPg->pgno-
6c60: 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45  1)*(off_t)SQLITE
6c70: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6c80: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
6c90: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
6ca0: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
6cb0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
6cc0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
6ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
6cf0: 6b 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  k;.      pPg->di
6d00: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c  rty = 0;.      l
6d10: 61 73 74 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  astPgno = pPg->p
6d20: 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gno;.    }.  }. 
6d30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6d40: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
6d50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
6d60: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
6d70: 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
6d80: 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
6d90: 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
6da0: 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
6db0: 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
6dc0: 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
6dd0: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
6de0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20  d..**.** A _get 
6df0: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
6e00: 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
6e10: 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
6e20: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
6e30: 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
6e40: 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
6e50: 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
6e60: 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
6e70: 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
6e80: 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
6e90: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
6ea0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
6eb0: 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
6ec0: 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
6ed0: 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
6ee0: 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
6ef0: 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
6f00: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
6f10: 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
6f20: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
6f30: 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
6f40: 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
6f50: 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
6f60: 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
6f70: 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
6f80: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6f90: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
6fa0: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
6fb0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
6fc0: 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65   also sqlitepage
6fd0: 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
6fe0: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
6ff0: 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
7000: 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
7010: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
7020: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
7030: 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
7040: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
7050: 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
7060: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
7070: 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
7080: 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
7090: 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
70a0: 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
70b0: 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
70c0: 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
70d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
70e0: 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
70f0: 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
7100: 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
7110: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
7120: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
7130: 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
7140: 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
7150: 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
7160: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
7170: 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
7180: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
7190: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 50  qlitepager_get(P
71a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
71b0: 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
71c0: 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
71d0: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
71e0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
71f0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
7200: 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
7210: 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  rors..  */ .  if
7220: 28 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70  ( pPager==0 || p
7230: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
7240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7250: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  R;.  }.  if( pPa
7260: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
7270: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
7280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
7290: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
72a0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
72b0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
72c0: 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
72d0: 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72  ed, then get a r
72e0: 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ead lock.  ** on
72f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7300: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
7310: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
7320: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7330: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
7340: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
7350: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7360: 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
7370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
7380: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
7390: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
73a0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
73b0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
73c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
73d0: 74 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20  ts, try to play 
73e0: 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  it back..    */.
73f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7400: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 73 71  useJournal && sq
7410: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
7420: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
7430: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  l) ){.       int
7440: 20 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20 20   rc, dummy;..   
7450: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69      /* Get a wri
7460: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
7470: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 2a  atabase.       *
7480: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
7490: 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28  liteOsWriteLock(
74a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
74b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
74c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
74d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 55     if( sqliteOsU
74e0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
74f0: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  d)!=SQLITE_OK ){
7500: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
7510: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
7520: 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20 20 20   happen! */.    
7530: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7540: 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
7550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7560: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
7570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
7580: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
7590: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
75a0: 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  = SQLITE_WRITELO
75b0: 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  CK;..       /* O
75c0: 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
75d0: 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
75e0: 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51  cess.  Return SQ
75f0: 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
7600: 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
7610: 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 20 61   get exclusive a
7620: 63 63 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75  ccess to the jou
7630: 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
7640: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
7650: 45 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 77  Even though we w
7660: 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61 64  ill only be read
7670: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
7680: 72 6e 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69 6e  rnal, not writin
7690: 67 2c 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  g,.       ** we 
76a0: 68 61 76 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  have to open the
76b0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72 69   journal for wri
76c0: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
76d0: 20 6f 62 74 61 69 6e 20 61 6e 0a 20 20 20 20 20   obtain an.     
76e0: 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
76f0: 63 63 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20 20  ccess lock..    
7700: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
7710: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65  = sqliteOsOpenRe
7720: 61 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  adWrite(pPager->
7730: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
7740: 72 2d 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29 3b  r->jfd, &dummy);
7750: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
7760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7770: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7780: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
7790: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
77a0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
77b0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
77c0: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
77d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
77e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
77f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
7800: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7810: 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 1;..       /*
7820: 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
7830: 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
7840: 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
7850: 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
7860: 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
7870: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
7880: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
7890: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
78a0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
78b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  er);.       if( 
78c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
78d0: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
78e0: 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
78f0: 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b    }.    pPg = 0;
7900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7910: 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65   Search for page
7920: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
7930: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
7940: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
7950: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
7960: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
7970: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
7980: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
7990: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
79a0: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61    int h;.    pPa
79b0: 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20  ger->nMiss++;.  
79c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
79d0: 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
79e0: 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46  ge || pPager->pF
79f0: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
7a00: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
7a10: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70   page */.      p
7a20: 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
7a30: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  c( sizeof(*pPg) 
7a40: 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  + SQLITE_PAGE_SI
7a50: 5a 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ZE + pPager->nEx
7a60: 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tra );.      if(
7a70: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
7a80: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
7a90: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
7aa0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
7ab0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
7ac0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
7ad0: 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
7ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7af0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7b00: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
7b10: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
7b20: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
7b30: 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
7b40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
7b50: 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
7b60: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
7b70: 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67  ->pPrevAll = pPg
7b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7b90: 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20  pPg->pPrevAll = 
7ba0: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
7bb0: 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
7bc0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
7bd0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
7be0: 20 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20       /* Recycle 
7bf0: 61 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e 20 20  an older page.  
7c00: 46 69 72 73 74 20 6c 6f 63 61 74 65 20 74 68 65  First locate the
7c10: 20 70 61 67 65 20 74 6f 20 62 65 20 72 65 63 79   page to be recy
7c20: 63 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  cled..      ** T
7c30: 72 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20 74  ry to find one t
7c40: 68 61 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79  hat is not dirty
7c50: 20 61 6e 64 20 69 73 20 6e 65 61 72 20 74 68 65   and is near the
7c60: 20 68 65 61 64 20 6f 66 0a 20 20 20 20 20 20 2a   head of.      *
7c70: 2a 20 6f 66 20 74 68 65 20 66 72 65 65 20 6c 69  * of the free li
7c80: 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  st */.      pPg 
7c90: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
7ca0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
7cb0: 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
7cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20   ){.        pPg 
7cd0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
7ce0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7cf0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
7d00: 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
7d10: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 65  that has not bee
7d20: 6e 20 75 73 65 64 20 72 65 63 65 6e 74 6c 79 0a  n used recently.
7d30: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 68 69        ** and whi
7d40: 63 68 20 69 73 20 6e 6f 74 20 64 69 72 74 79 2c  ch is not dirty,
7d50: 20 74 68 65 6e 20 73 79 6e 63 20 74 68 65 20 6a   then sync the j
7d60: 6f 75 72 6e 61 6c 20 61 6e 64 20 77 72 69 74 65  ournal and write
7d70: 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 64 69   all.      ** di
7d80: 72 74 79 20 66 72 65 65 20 70 61 67 65 73 20 69  rty free pages i
7d90: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
7da0: 20 66 69 6c 65 2c 20 74 68 75 73 20 6d 61 6b 69   file, thus maki
7db0: 6e 67 20 74 68 65 6d 0a 20 20 20 20 20 20 2a 2a  ng them.      **
7dc0: 20 63 6c 65 61 6e 20 70 61 67 65 73 20 61 6e 64   clean pages and
7dd0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
7de0: 65 63 79 63 6c 69 6e 67 2e 0a 20 20 20 20 20 20  ecycling..      
7df0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 68  **.      ** We h
7e00: 61 76 65 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ave to sync the 
7e10: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
7e20: 72 69 74 69 6e 67 20 61 20 70 61 67 65 20 74 6f  riting a page to
7e30: 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
7e40: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  ** database.  Bu
7e50: 74 20 73 79 6e 63 69 6e 67 20 69 73 20 61 20 76  t syncing is a v
7e60: 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
7e70: 6f 6e 2e 20 20 53 6f 20 61 66 74 65 72 20 61 0a  on.  So after a.
7e80: 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2c 20 69        ** sync, i
7e90: 74 20 69 73 20 62 65 73 74 20 74 6f 20 77 72 69  t is best to wri
7ea0: 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  te everything we
7eb0: 20 63 61 6e 20 62 61 63 6b 20 74 6f 20 74 68 65   can back to the
7ec0: 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 64   main.      ** d
7ed0: 61 74 61 62 61 73 65 20 74 6f 20 6d 69 6e 69 6d  atabase to minim
7ee0: 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f 66 20  ize the risk of 
7ef0: 68 61 76 69 6e 67 20 74 6f 20 73 79 6e 63 20 61  having to sync a
7f00: 67 61 69 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  gain in the.    
7f10: 20 20 2a 2a 20 6e 65 61 72 20 66 75 74 75 72 65    ** near future
7f20: 2e 20 20 54 68 61 74 20 69 73 20 77 68 79 20 77  .  That is why w
7f30: 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72 74  e write all dirt
7f40: 79 20 70 61 67 65 73 20 61 66 74 65 72 20 61 0a  y pages after a.
7f50: 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2e 0a 20        ** sync.. 
7f60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7f70: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
7f80: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
7f90: 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67 65 72  cAllPages(pPager
7fa0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
7fb0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
7fc0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
7fd0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
7fe0: 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
7ff0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
8000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8010: 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
8020: 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
8030: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8040: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8050: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
8060: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8070: 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
8080: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
8090: 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
80a0: 72 65 63 79 63 6c 79 69 6e 67 20 69 73 20 6d 61  recyclying is ma
80b0: 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
80c0: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20  llback, then.   
80d0: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c     ** set the gl
80e0: 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
80f0: 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
8100: 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20  isabling the.   
8110: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e     ** sqlite_don
8120: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  t_rollback() opt
8130: 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
8140: 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
8150: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
8160: 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
8170: 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
8180: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
8190: 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
81a0: 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
81b0: 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
81c0: 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
81d0: 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
81e0: 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
81f0: 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  ember.      ** t
8200: 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
8210: 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
8220: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
8230: 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
8240: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61  t.      ** be ma
8250: 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
8260: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
8270: 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a   on out..      *
8280: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
8290: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
82a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
82b0: 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
82c0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  k = 1;.      }..
82d0: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20        /* Unlink 
82e0: 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
82f0: 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
8300: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
8310: 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
8320: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
8330: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
8340: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
8350: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
8360: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
8370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8380: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8390: 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
83a0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
83b0: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
83c0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
83d0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
83e0: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
83f0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
8400: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
8410: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
8420: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
8440: 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
8450: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
8460: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
8470: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
8480: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
8490: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
84a0: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 20  pPrevFree = 0;. 
84b0: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e       if( pPg->pN
84c0: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
84d0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
84e0: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
84f0: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
8500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8510: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
8520: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
8530: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
8540: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
8550: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65 6c  tHash;.      }el
8560: 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  se{.        h = 
8570: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
8580: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
8590: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
85a0: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
85b0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
85c0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
85d0: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20  pNextHash;.     
85e0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e   }.      pPg->pN
85f0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
8600: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
8610: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66      pPager->nOvf
8620: 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  l++;.    }.    p
8630: 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
8640: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8650: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
8660: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
8670: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
8680: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
8690: 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
86a0: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
86b0: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
86c0: 29 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73  )))!=0;.    }els
86d0: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
86e0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
86f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
8700: 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20 28 69  r->aInCkpt && (i
8710: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
8720: 3e 63 6b 70 74 53 69 7a 65 0a 20 20 20 20 20 20  >ckptSize.      
8730: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
8740: 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f  r->aInCkpt[pgno/
8750: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
8760: 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
8770: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
8780: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
8790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
87a0: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b  e_remove_from_ck
87b0: 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  pt_list(pPg);.  
87c0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
87d0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
87e0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
87f0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
8800: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
8810: 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
8820: 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
8830: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
8840: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
8850: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
8860: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
8870: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
8880: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
8890: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
88a0: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
88b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
88c0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
88d0: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
88e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
88f0: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71  r->dbSize<0 ) sq
8900: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
8910: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
8920: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
8930: 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b  ize<(int)pgno ){
8940: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
8950: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
8960: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
8970: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73  _SIZE);.    }els
8980: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  e{.      int rc;
8990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53  .      sqliteOsS
89a0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
89b0: 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74   (pgno-1)*(off_t
89c0: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
89d0: 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
89e0: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
89f0: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
8a00: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
8a10: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
8a20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
8a30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8a40: 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
8a50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
8a60: 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28  qliteOsFileSize(
8a70: 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  &pPager->fd,&fil
8a80: 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
8a90: 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
8aa0: 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
8ab0: 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  no*SQLITE_PAGE_S
8ac0: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
8ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8ae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8af0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
8b00: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
8b10: 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  0, SQLITE_PAGE_S
8b20: 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  IZE);.        }.
8b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
8b50: 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
8b60: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
8b70: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
8b80: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
8b90: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8ba0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
8bb0: 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
8bc0: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
8bd0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48  /.    pPager->nH
8be0: 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72  it++;.    page_r
8bf0: 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
8c00: 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
8c10: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
8c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
8c40: 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
8c50: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
8c60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
8c70: 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
8c80: 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
8c90: 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
8ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8cb0: 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
8cc0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
8cd0: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
8ce0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70  See also sqlitep
8cf0: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
8d00: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
8d10: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
8d20: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70 61  .** and sqlitepa
8d30: 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
8d40: 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
8d50: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
8d60: 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
8d70: 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
8d80: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
8d90: 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
8da0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
8db0: 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
8dc0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
8dd0: 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
8de0: 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
8df0: 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
8e00: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
8e10: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  epager_lookup(Pa
8e20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
8e30: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
8e40: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b   *pPg;..  /* Mak
8e50: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
8e60: 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
8e70: 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
8e80: 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d   .  if( pPager==
8e90: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a  0 || pgno==0 ){.
8ea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8eb0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
8ec0: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
8ed0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
8ee0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8ef0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
8f00: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ref==0 ){.    re
8f10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
8f20: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
8f30: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
8f40: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
8f50: 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
8f60: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
8f70: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
8f80: 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
8f90: 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
8fa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
8fb0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
8fc0: 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
8fd0: 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
8fe0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
8ff0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
9000: 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
9010: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
9020: 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
9030: 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
9040: 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
9050: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
9060: 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
9070: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
9080: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
9090: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
90a0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
90b0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
90c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
90d0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
90e0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41   */.  pPg = DATA
90f0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
9100: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
9110: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
9120: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
9130: 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  NFO(pPg);..  /* 
9140: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
9150: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
9160: 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
9170: 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
9180: 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
9190: 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
91a0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
91b0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
91c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
91d0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
91e0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
91f0: 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
9200: 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
9210: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
9220: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
9230: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
9240: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
9250: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
9260: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
9270: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
9280: 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
9290: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
92a0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
92b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
92c0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
92d0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
92e0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
92f0: 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
9300: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
9310: 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
9320: 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
9330: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
9340: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
9350: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
9360: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
9370: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
9380: 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
9390: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
93a0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
93b0: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
93c0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
93d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
93e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
93f0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
9400: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
9410: 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
9420: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
9430: 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 6f   write.** lock o
9440: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9450: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
9460: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9470: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
9480: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
9490: 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
94a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
94b0: 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
94c0: 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
94d0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
94e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
94f0: 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
9500: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
9510: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
9520: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9530: 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52  state==SQLITE_WR
9540: 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ITELOCK );.  ass
9550: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
9560: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
9570: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9580: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9590: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
95a0: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
95b0: 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
95c0: 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
95d0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
95e0: 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rnal==0 ){.    s
95f0: 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28  qliteOsReadLock(
9600: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
9610: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9620: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  = SQLITE_READLOC
9630: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
9640: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
9650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
9660: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
9670: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
9680: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
9690: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
96a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
96b0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
96c0: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
96d0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
96e0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
96f0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9700: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
9710: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
9720: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
9730: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
9740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9750: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
9760: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9770: 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
9780: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
9790: 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
97a0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
97b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
97c0: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
97d0: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
97e0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
97f0: 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 61 67  bSize;.  if( pag
9800: 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29 7b  er_old_format ){
9810: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9820: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
9830: 3e 6a 66 64 2c 20 61 4f 6c 64 4a 6f 75 72 6e 61  >jfd, aOldJourna
9840: 6c 4d 61 67 69 63 2c 0a 20 20 20 20 20 20 20 20  lMagic,.        
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9860: 69 7a 65 6f 66 28 61 4f 6c 64 4a 6f 75 72 6e 61  izeof(aOldJourna
9870: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 7d 65 6c 73  lMagic));.  }els
9880: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
9890: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
98a0: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
98b0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
98c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
98d0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
98e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
98f0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
9900: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
9910: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
9920: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
9930: 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  ckptAutoopen && 
9940: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9950: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9960: 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e  pager_ckpt_begin
9970: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
9980: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9990: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
99a0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
99b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
99c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
99d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
99e0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
99f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9a00: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75    .}../*.** Acqu
9a10: 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
9a20: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9a30: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
9a40: 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
9a50: 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
9a60: 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
9a70: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
9a80: 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  epager_commit() 
9a90: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
9aa0: 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  *  sqlitepager_r
9ab0: 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
9ac0: 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
9ad0: 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  itepager_close()
9ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
9af0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
9b00: 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
9b10: 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
9b20: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
9b30: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
9b40: 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
9b50: 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
9b60: 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
9b70: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
9b80: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
9b90: 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
9ba0: 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
9bb0: 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a  is used merely.*
9bc0: 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 70  * to acquire a p
9bd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
9be0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
9bf0: 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
9c00: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65  there.** is alre
9c10: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
9c20: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
9c30: 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
9c40: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
9c50: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
9c60: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
9c70: 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72 61    For.** tempora
9c80: 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ry files, the op
9c90: 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
9ca0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
9cb0: 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  erred until.** t
9cc0: 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61  here is an actua
9cd0: 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
9ce0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
9cf0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
9d00: 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
9d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74   write-locked, t
9d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9d30: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
9d40: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
9d50: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
9d60: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
9d70: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
9d80: 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
9d90: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
9da0: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
9db0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
9dc0: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
9dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9de0: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
9df0: 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  E_UNLOCK );.  if
9e00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9e10: 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b  =SQLITE_READLOCK
9e20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9e30: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
9e40: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
9e50: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c  = sqliteOsWriteL
9e60: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
9e70: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
9e80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9e90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9ea0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
9eb0: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49  ate = SQLITE_WRI
9ec0: 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  TELOCK;.    pPag
9ed0: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20  er->dirtyFile = 
9ee0: 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
9ef0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
9f00: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
9f10: 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
9f20: 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
9f30: 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
9f40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9f50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
9f60: 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
9f70: 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
9f80: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
9f90: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9fa0: 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
9fb0: 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
9fc0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9fd0: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
9fe0: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
9ff0: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
a000: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
a010: 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
a020: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
a030: 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
a040: 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
a050: 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
a060: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
a070: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
a080: 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c  f the write.** l
a090: 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
a0a0: 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
a0b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
a0c0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
a0d0: 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
a0e0: 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
a0f0: 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
a100: 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
a110: 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
a120: 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
a130: 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
a140: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
a150: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
a160: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
a170: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
a180: 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
a190: 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
a1a0: 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
a1b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
a1c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
a1d0: 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
a1e0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
a1f0: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
a200: 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
a210: 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
a220: 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
a230: 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
a240: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d   sqlitepager_com
a250: 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 70  mit() or sqlitep
a260: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
a270: 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
a280: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
a290: 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
a2a0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
a2b0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
a2c0: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
a2d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
a2e0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
a2f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
a300: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
a310: 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
a320: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
a330: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
a340: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
a350: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
a360: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
a370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a380: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
a390: 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
a3a0: 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
a3b0: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
a3c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
a3d0: 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
a3e0: 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
a3f0: 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
a400: 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
a410: 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
a420: 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
a430: 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43 6b  al && (pPg->inCk
a440: 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 6b  pt || pPager->ck
a450: 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  ptInUse==0) ){. 
a460: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
a470: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  File = 1;.    re
a480: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a490: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
a4a0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
a4b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
a4c0: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
a4d0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
a4e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a4f0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
a500: 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
a510: 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  al.  ** or both.
a520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74  .  **.  ** First
a530: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
a540: 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
a550: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
a560: 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74  s and.  ** creat
a570: 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
a580: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
a590: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
a5a0: 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  e!=SQLITE_UNLOCK
a5b0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
a5c0: 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  epager_begin(pDa
a5d0: 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ta);.  if( rc!=S
a5e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a5f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a600: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a610: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57  >state==SQLITE_W
a620: 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RITELOCK );.  if
a630: 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
a640: 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
a650: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
a660: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
a670: 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
a680: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
a690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
a6a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
a6b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
a6c0: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
a6d0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
a6e0: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   );.  pPager->di
a6f0: 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20 20  rtyFile = 1;..  
a700: 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
a710: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
a720: 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
a730: 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  e a write lock o
a740: 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20  n the.  ** main 
a750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
a760: 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
a770: 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 74 72  t page to the tr
a780: 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
a790: 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
a7a0: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
a7b0: 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  dy..  */.  if( !
a7c0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
a7d0: 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
a7e0: 72 6e 61 6c 20 0a 20 20 20 20 20 20 20 20 20 26  rnal .         &
a7f0: 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
a800: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
a810: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63  DbSize ){.    rc
a820: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
a830: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 67  pPager->jfd, pPg
a840: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
a850: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a860: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a870: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
a880: 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 2c 20  er->jfd, pData, 
a890: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
a8a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a8b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a8c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61  {.      sqlitepa
a8d0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
a8e0: 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
a8f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
a900: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
a910: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
a920: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
a930: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
a940: 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
a950: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
a960: 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
a970: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
a980: 37 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  7);.    pPager->
a990: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
a9a0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
a9b0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
a9c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
a9d0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
a9e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
a9f0: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
aa00: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
aa10: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
aa20: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
aa30: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
aa40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
aa50: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
aa60: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
aa70: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
aa80: 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
aa90: 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
aaa0: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
aab0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
aac0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
aad0: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
aae0: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
aaf0: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
ab00: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
ab10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
ab20: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
ab30: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
ab40: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
ab50: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72  gDbSize );.    r
ab60: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
ab70: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70  &pPager->cpfd, p
ab80: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
ab90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aba0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
abb0: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
abc0: 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61 74  ager->cpfd, pDat
abd0: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
abe0: 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IZE);.    }.    
abf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ac00: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
ac10: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
ac20: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
ac30: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
ac40: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
ac50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
ac60: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
ac70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
ac80: 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Ckpt!=0 );.    p
ac90: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
aca0: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
acb0: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
acc0: 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
acd0: 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b  _ckpt_list(pPg);
ace0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
acf0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
ad00: 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
ad10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
ad20: 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
ad30: 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
ad40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ad50: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
ad60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ad70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
ad80: 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
ad90: 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
ada0: 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
adb0: 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
adc0: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
add0: 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
ade0: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
adf0: 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
ae00: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
ae10: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
ae20: 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
ae30: 65 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  epager_iswriteab
ae40: 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
ae50: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
ae60: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
ae70: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
ae80: 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
ae90: 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
aea0: 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
aeb0: 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
aec0: 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
aed0: 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
aee0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
aef0: 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
af00: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
af10: 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
af20: 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
af30: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
af40: 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
af50: 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
af60: 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
af70: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
af80: 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
af90: 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
afa0: 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
afb0: 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
afc0: 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
afd0: 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
afe0: 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
aff0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
b000: 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
b010: 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
b020: 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
b030: 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
b040: 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  tepager_dont_rol
b050: 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
b060: 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
b070: 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
b080: 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
b090: 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
b0a0: 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
b0b0: 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
b0c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
b0d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b0e0: 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
b0f0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
b100: 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
b110: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
b120: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e   sqlitepager_don
b130: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
b140: 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
b150: 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
b160: 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
b170: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
b180: 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
b190: 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
b1a0: 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
b1b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
b1c0: 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
b1d0: 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
b1e0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
b1f0: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
b200: 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
b210: 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
b220: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
b230: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
b240: 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
b250: 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
b260: 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
b270: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
b280: 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
b290: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
b2a0: 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
b2b0: 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
b2c0: 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
b2d0: 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
b2e0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
b2f0: 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
b300: 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
b310: 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
b320: 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
b330: 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
b340: 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
b350: 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
b360: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
b370: 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
b380: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b390: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b3a0: 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
b3b0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
b3c0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50  ger, pgno);.  pP
b3d0: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
b3e0: 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
b3f0: 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29   && pPg->dirty )
b400: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
b410: 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
b420: 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
b430: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
b440: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
b450: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
b460: 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
b470: 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
b480: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
b490: 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
b4a0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
b4b0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
b4c0: 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
b4d0: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
b4e0: 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
b4f0: 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
b500: 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
b510: 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
b520: 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
b530: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
b540: 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
b550: 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
b560: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
b570: 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
b580: 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
b590: 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
b5a0: 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
b5b0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
b5c0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
b5d0: 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
b5e0: 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
b5f0: 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
b600: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
b610: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
b620: 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
b630: 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
b640: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
b650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
b660: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
b670: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
b680: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
b690: 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
b6a0: 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
b6b0: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
b6c0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
b6d0: 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
b6e0: 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
b6f0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
b700: 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
b710: 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
b720: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
b730: 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
b740: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
b750: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
b760: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
b770: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
b780: 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
b790: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
b7a0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
b7b0: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
b7c0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
b7d0: 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
b7e0: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
b7f0: 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50  _WRITELOCK || pP
b800: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b810: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
b820: 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
b830: 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
b840: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
b850: 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ck ) return;.  i
b860: 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
b870: 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
b880: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
b890: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
b8a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b8b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
b8c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
b8d0: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
b8e0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
b8f0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
b900: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
b910: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
b920: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
b930: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
b940: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
b950: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
b960: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
b970: 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f  age_add_to_ckpt_
b980: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
b990: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
b9a0: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
b9b0: 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20  !pPg->inCkpt && 
b9c0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
b9d0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
b9e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b9f0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
ba00: 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
ba10: 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
ba20: 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
ba30: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  t( pPager->aInCk
ba40: 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  pt!=0 );.    pPa
ba50: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
ba60: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
ba70: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
ba80: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63     page_add_to_c
ba90: 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  kpt_list(pPg);. 
baa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d   }.}../*.** Comm
bab0: 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
bac0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
bad0: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
bae0: 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
baf0: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
bb00: 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
bb10: 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
bb20: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
bb30: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
bb40: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
bb50: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
bb60: 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
bb70: 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
bb80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
bb90: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
bba0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
bbb0: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
bbc0: 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
bbd0: 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47  er->errMask==PAG
bbe0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
bbf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
bc00: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
bc10: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
bc20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bc30: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bc40: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
bc50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
bc60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bc70: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
bc80: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
bc90: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
bca0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
bcb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
bcc0: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
bcd0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
bce0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
bcf0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
bd00: 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20  r->dirtyFile==0 
bd10: 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
bd20: 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
bd30: 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
bd40: 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73 53  suming sqliteOsS
bd50: 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
bd60: 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
bd70: 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
bd80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
bd90: 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  e file. */.    r
bda0: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
bdb0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
bdc0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
bdd0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
bde0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
bdf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
be00: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66  rnalOpen );.  if
be10: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
be20: 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79  nc && sqliteOsSy
be30: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
be40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
be50: 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
be60: 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  bort;.  }.  for(
be70: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
be80: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
be90: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
bea0: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
beb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bec0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65   rc = sqliteOsSe
bed0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
bee0: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  (pPg->pgno-1)*(o
bef0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
bf00: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
bf10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bf20: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
bf30: 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  t;.    rc = sqli
bf40: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
bf50: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
bf60: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
bf70: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
bf80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bf90: 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
bfa0: 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  t_abort;.  }.  i
bfb0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
bfc0: 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79  nc && sqliteOsSy
bfd0: 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21  nc(&pPager->fd)!
bfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bff0: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
c000: 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
c010: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
c020: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
c030: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c040: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
c050: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
c060: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
c070: 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
c080: 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
c090: 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
c0a0: 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
c0b0: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
c0c0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
c0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c0e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c0f0: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
c100: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c110: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
c120: 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
c130: 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
c140: 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65  o read-only mode
c150: 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
c160: 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
c170: 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
c180: 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
c190: 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
c1a0: 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
c1b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c1c0: 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
c1d0: 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
c1e0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
c1f0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
c200: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
c210: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
c220: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
c230: 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
c240: 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
c250: 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
c260: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
c270: 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
c280: 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
c290: 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
c2a0: 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
c2b0: 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
c2c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
c2d0: 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
c2e0: 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
c2f0: 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
c300: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
c310: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
c320: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c330: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
c340: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c350: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 21   int rc;.  if( !
c360: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
c370: 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
c380: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
c390: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
c3a0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
c3b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
c3c0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
c3d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
c3e0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
c3f0: 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d  sk!=0 && pPager-
c400: 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f  >errMask!=PAGER_
c410: 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
c420: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
c430: 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e>=SQLITE_WRITEL
c440: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  OCK ){.      pag
c450: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
c460: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  er);.    }.    r
c470: 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
c480: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
c490: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
c4a0: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
c4b0: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  TELOCK ){.    re
c4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c4d0: 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72    }.  rc = pager
c4e0: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
c4f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c500: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
c510: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
c520: 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
c530: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
c540: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
c550: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
c560: 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
c570: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
c580: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
c590: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c5a0: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
c5b0: 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
c5c0: 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
c5d0: 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
c5e0: 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
c5f0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
c600: 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  _isreadonly(Page
c610: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
c620: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
c630: 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
c640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c650: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c660: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
c670: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
c680: 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  tepager_stats(Pa
c690: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c6a0: 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
c6b0: 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
c6c0: 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
c6d0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
c6e0: 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
c6f0: 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
c700: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
c710: 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
c720: 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
c730: 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
c740: 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
c750: 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
c760: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
c770: 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
c780: 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
c790: 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn a;.}../*.** 
c7a0: 53 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69  Set the checkpoi
c7b0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
c7c0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
c7d0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
c7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c7f0: 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
c800: 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68 65  open.  A new che
c810: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
c820: 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
c830: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
c840: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
c850: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
c860: 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
c870: 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
c880: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
c890: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
c8a0: 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
c8b0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
c8c0: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
c8d0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
c8e0: 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  E];.  if( !pPage
c8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
c900: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  {.    pPager->ck
c910: 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  ptAutoopen = 1;.
c920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c930: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
c940: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
c950: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73  nalOpen );.  ass
c960: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b  ert( !pPager->ck
c970: 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61  ptInUse );.  pPa
c980: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73  ger->aInCkpt = s
c990: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
c9a0: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
c9b0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
c9c0: 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b  r->aInCkpt==0 ){
c9d0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
c9e0: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
c9f0: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
ca00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ca10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
ca20: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
ca30: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
ca40: 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  ckptJSize);.  if
ca50: 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74  ( rc ) goto ckpt
ca60: 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
ca70: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
ca80: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
ca90: 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ze;.  if( !pPage
caa0: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20  r->ckptOpen ){. 
cab0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
cac0: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
cad0: 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  mp, &pPager->cpf
cae0: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
caf0: 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e   goto ckpt_begin
cb00: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
cb10: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
cb20: 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
cb30: 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >ckptInUse = 1;.
cb40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cb50: 4f 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e  OK;. .ckpt_begin
cb60: 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
cb70: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29  Pager->aInCkpt )
cb80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
cb90: 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74  (pPager->aInCkpt
cba0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
cbb0: 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a  InCkpt = 0;.  }.
cbc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cbd0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63  /*.** Commit a c
cbe0: 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  heckpoint..*/.in
cbf0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  t sqlitepager_ck
cc00: 70 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  pt_commit(Pager 
cc10: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
cc20: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
cc30: 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
cc40: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
cc50: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
cc60: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
cc70: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 72 75  .    sqliteOsTru
cc80: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 63  ncate(&pPager->c
cc90: 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  pfd, 0);.    pPa
cca0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d  ger->ckptInUse =
ccb0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   0;.    sqliteFr
ccc0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  ee( pPager->aInC
ccd0: 6b 70 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65  kpt );.    pPage
cce0: 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a  r->aInCkpt = 0;.
ccf0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
cd00: 65 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20  er->pCkpt; pPg; 
cd10: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
cd20: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
cd30: 4e 65 78 74 43 6b 70 74 3b 0a 20 20 20 20 20 20  NextCkpt;.      
cd40: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 43  assert( pPg->inC
cd50: 6b 70 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  kpt );.      pPg
cd60: 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20  ->inCkpt = 0;.  
cd70: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b      pPg->pPrevCk
cd80: 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43  pt = pPg->pNextC
cd90: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  kpt = 0;.    }. 
cda0: 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74     pPager->pCkpt
cdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
cdc0: 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e  er->ckptAutoopen
cdd0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
cde0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cdf0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68  ** Rollback a ch
ce00: 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
ce10: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
ce20: 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  t_rollback(Pager
ce30: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
ce40: 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
ce50: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a  r->ckptInUse ){.
ce60: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 63      rc = pager_c
ce70: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  kpt_playback(pPa
ce80: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
ce90: 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69  pager_ckpt_commi
cea0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
ceb0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
cec0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
ced0: 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70  ager->ckptAutoop
cee0: 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
cef0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
cf00: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
cf10: 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
cf20: 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
cf30: 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
cf40: 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
cf50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
cf60: 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
cf70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
cf80: 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
cf90: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
cfa0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
cfb0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
cfc0: 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
cfd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72  continue;.    pr
cfe0: 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
cff0: 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
d000: 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
d010: 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50  Pg->pgno, (int)P
d020: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
d030: 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
d040: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.