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

Artifact d261a3a0b4e96a400ef5432297edec09b041e9c7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 39  : pager.c,v 1.39
0350: 20 32 30 30 32 2f 30 32 2f 31 34 20 31 32 3a 35   2002/02/14 12:5
0360: 30 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a 2a  0:35 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 69 6e  ges */.  char in
0ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
0cc0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
0cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
0ce0: 2f 0a 20 20 63 68 61 72 20 69 6e 43 6b 70 74 3b  /.  char inCkpt;
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 72     /* TRUE if wr
0d10: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 68 65  itten to the che
0d20: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
0d30: 2a 2f 0a 20 20 63 68 61 72 20 64 69 72 74 79 3b  */.  char dirty;
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
0d60: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
0d70: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
0d80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45    /* SQLITE_PAGE
0d90: 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70  _SIZE bytes of p
0da0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
0db0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
0dc0: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
0dd0: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
0de0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
0df0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
0e00: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0e10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
0e20: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
0e30: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
0e40: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
0e50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
0e60: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
0e70: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
0e80: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
0e90: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
0ea0: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
0eb0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
0ec0: 4f 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69  O_EXTRA(P) ((voi
0ed0: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  d*)&((char*)(&(P
0ee0: 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41  )[1]))[SQLITE_PA
0ef0: 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a  GE_SIZE])../*.**
0f00: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
0f10: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
0f20: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
0f30: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
0f40: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
0f50: 62 65 72 2e 20 20 4b 6e 75 74 68 20 73 61 79 73  ber.  Knuth says
0f60: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   this should be 
0f70: 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a  a prime number..
0f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f  */.#define N_PG_
0f90: 48 41 53 48 20 33 37 33 0a 0a 2f 2a 0a 2a 2a 20  HASH 373../*.** 
0fa0: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
0fb0: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
0fc0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0fd0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0fe0: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
0ff0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1010: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1020: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
1030: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
1040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1050: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
1060: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69  l file */.  OsFi
1070: 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20  le fd, jfd;     
1080: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1090: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
10a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
10b0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
10c0: 20 63 70 66 64 3b 20 20 20 20 20 20 20 20 20 20   cpfd;          
10d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
10e0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
10f0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
1100: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  nal */.  int jou
1110: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
1120: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1130: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
1140: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
1150: 64 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 4f  d */.  int ckptO
1160: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
1170: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1180: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
1190: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
11a0: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
11d0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
11e0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
11f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1200: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
1210: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
1220: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 53  e */.  int ckptS
1230: 69 7a 65 2c 20 63 6b 70 74 4a 53 69 7a 65 3b 20  ize, ckptJSize; 
1240: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
1250: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1260: 61 6c 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e  al at ckpt_begin
1270: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  () */.  int nExt
1280: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
1290: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
12a0: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
12b0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
12c0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
12d0: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
12e0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
12f0: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
1300: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
1310: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
1320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1330: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
1340: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
1350: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
1380: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
1390: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
13a0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
13d0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
13e0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
13f0: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
1400: 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20  , nOvfl;     /* 
1410: 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  Cache hits, miss
1420: 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65  ing, and LRU ove
1430: 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 75 6e 73 69  rflows */.  unsi
1440: 67 6e 65 64 20 63 68 61 72 20 73 74 61 74 65 3b  gned char state;
1450: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
1460: 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c  E_UNLOCK, _READL
1470: 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43  OCK or _WRITELOC
1480: 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  K */.  unsigned 
1490: 63 68 61 72 20 65 72 72 4d 61 73 6b 3b 20 20 20  char errMask;   
14a0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
14b0: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
14c0: 72 6f 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  rors */.  unsign
14d0: 65 64 20 63 68 61 72 20 74 65 6d 70 46 69 6c 65  ed char tempFile
14e0: 3b 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  ;     /* zFilena
14f0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
1500: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  y file */.  unsi
1510: 67 6e 65 64 20 63 68 61 72 20 72 65 61 64 4f 6e  gned char readOn
1520: 6c 79 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ly;     /* True 
1530: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
1540: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 6e  database */.  un
1550: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 65 65 64  signed char need
1560: 53 79 6e 63 3b 20 20 20 20 20 2f 2a 20 54 72 75  Sync;     /* Tru
1570: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
1580: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
1590: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 6e   journal */.  un
15a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 49 6e  signed char *aIn
15b0: 4a 6f 75 72 6e 61 6c 3b 20 20 2f 2a 20 4f 6e 65  Journal;  /* One
15c0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
15d0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
15e0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73  se file */.  uns
15f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 49 6e 43  igned char *aInC
1600: 6b 70 74 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 20  kpt;     /* One 
1610: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
1620: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1630: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  e */.  PgHdr *pF
1640: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
1650: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1660: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
1670: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
1680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1690: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
16a0: 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68  /.  PgHdr *aHash
16b0: 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20  [N_PG_HASH];    
16c0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
16d0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
16e0: 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a   of PgHdr */.};.
16f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
1700: 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62   bits that can b
1710: 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65  e set in Pager.e
1720: 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69  rrMask..*/.#defi
1730: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  ne PAGER_ERR_FUL
1740: 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61  L     0x01  /* a
1750: 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20   write() failed 
1760: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1770: 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78  _ERR_MEM      0x
1780: 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20  02  /* malloc() 
1790: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
17a0: 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  e PAGER_ERR_LOCK
17b0: 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72       0x04  /* er
17c0: 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ror in the locki
17d0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23  ng protocol */.#
17e0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
17f0: 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20  _CORRUPT  0x08  
1800: 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a  /* database or j
1810: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
1820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  n */.#define PAG
1830: 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20  ER_ERR_DISK     
1840: 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c  0x10  /* general
1850: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
1860: 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65  - bad hard drive
1870: 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ? */../*.** The 
1880: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
1890: 74 61 69 6e 73 20 70 61 67 65 20 72 65 63 6f 72  tains page recor
18a0: 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ds in the follow
18b0: 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a  ing.** format..*
18c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
18d0: 20 50 61 67 65 52 65 63 6f 72 64 20 50 61 67 65   PageRecord Page
18e0: 52 65 63 6f 72 64 3b 0a 73 74 72 75 63 74 20 50  Record;.struct P
18f0: 61 67 65 52 65 63 6f 72 64 20 7b 0a 20 20 50 67  ageRecord {.  Pg
1900: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1930: 2a 2f 0a 20 20 63 68 61 72 20 61 44 61 74 61 5b  */.  char aData[
1940: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
1950: 5d 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20  ];  /* Original 
1960: 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 70 67  data for page pg
1970: 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  no */.};../*.** 
1980: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
1990: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
19a0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
19b0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
19c0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
19d0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
19e0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
19f0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
1a00: 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  eck..*/.static c
1a10: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a20: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
1a30: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
1a40: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
1a50: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
1a60: 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd4,.};../*.
1a70: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
1a80: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
1a90: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
1aa0: 20 28 28 50 4e 29 25 4e 5f 50 47 5f 48 41 53 48   ((PN)%N_PG_HASH
1ab0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
1ac0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1ad0: 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a  tracking here:.*
1ae0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
1af0: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 5f 72 65  T.  int pager_re
1b00: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
1b10: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
1b20: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
1b30: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
1b40: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
1b50: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 5f  .    if( !pager_
1b60: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
1b70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69   return;.    pri
1b80: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46  ntf(.       "REF
1b90: 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78  CNT: %4d addr=0x
1ba0: 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  %08x nRef=%d\n",
1bb0: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
1bc0: 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
1bd0: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
1be0: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
1bf0: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
1c00: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1c10: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
1c20: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
1c30: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
1c40: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
1c50: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
1c60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
1c70: 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e  vert the bits in
1c80: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
1c90: 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70  Mask into an app
1ca0: 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72  roprate.** retur
1cb0: 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  n code..*/.stati
1cc0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63  c int pager_errc
1cd0: 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
1ce0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1d00: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
1d10: 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  & PAGER_ERR_LOCK
1d20: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
1d30: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66  E_PROTOCOL;.  if
1d40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
1d50: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49  k & PAGER_ERR_DI
1d60: 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  SK )    rc = SQL
1d70: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28  ITE_IOERR;.  if(
1d80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1d90: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   & PAGER_ERR_FUL
1da0: 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  L )    rc = SQLI
1db0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70  TE_FULL;.  if( p
1dc0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
1dd0: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29   PAGER_ERR_MEM )
1de0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1df0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50  _NOMEM;.  if( pP
1e00: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
1e10: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
1e20: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
1e30: 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72  CORRUPT;.  retur
1e40: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
1e50: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1e60: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
1e70: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
1e80: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
1e90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ea0: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
1eb0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
1ec0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
1ed0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
1ee0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1ef0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
1f00: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
1f10: 67 6e 6f 20 25 20 4e 5f 50 47 5f 48 41 53 48 5d  gno % N_PG_HASH]
1f20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
1f30: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
1f40: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
1f50: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
1f60: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1f70: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
1f80: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
1f90: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1fa0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1fb0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
1fc0: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
1fd0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
1fe0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
1ff0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
2000: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
2010: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
2020: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
2030: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
2040: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
2050: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
2060: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
2070: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
2080: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
2090: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
20a0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
20b0: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Pg, *pNext;.  fo
20c0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
20d0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
20e0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
20f0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
2100: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2110: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
2120: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
2130: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2140: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
2150: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
2160: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2170: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2180: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
2190: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
21a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21b0: 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate>=SQLITE_WRIT
21c0: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c  ELOCK ){.    sql
21d0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
21e0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
21f0: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
2200: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
2210: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2220: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
2230: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2240: 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = -1;.  pPager->
2250: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65  nRef = 0;.  asse
2260: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2270: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a  nalOpen==0 );.}.
2280: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
2290: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22a0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
22b0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
22c0: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
22d0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
22e0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
22f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61  is routine relea
2300: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
2310: 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 61  .** write lock a
2320: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 72 65  nd acquires a re
2330: 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ad lock in its p
2340: 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e  lace.  The journ
2350: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 64 65  al file.** is de
2360: 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  leted and closed
2370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2380: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
2390: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
23a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
23b0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28 20  Hdr *pPg;.  if( 
23c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 53 51  pPager->state<SQ
23d0: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
23e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23f0: 4b 3b 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72  K;.  sqlitepager
2400: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _ckpt_commit(pPa
2410: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73  ger);.  sqliteOs
2420: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
2430: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  fd);.  pPager->j
2440: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
2450: 20 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65    sqliteOsDelete
2460: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2470: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
2480: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
2490: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
24a0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
24b0: 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  K );.  sqliteFre
24c0: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
24d0: 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
24e0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
24f0: 30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  0;.  for(pPg=pPa
2500: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
2510: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
2520: 6c 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  l){.    pPg->inJ
2530: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
2540: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
2550: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
2560: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
2570: 44 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  DLOCK;.  return 
2580: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
2590: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
25a0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
25b0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
25c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
25d0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
25e0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
25f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2600: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
2610: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
2620: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
2630: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2640: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2660: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
2670: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
2680: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
2690: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  ..  rc = sqliteO
26a0: 73 52 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65  sRead(jfd, &pgRe
26b0: 63 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 29  c, sizeof(pgRec)
26c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
26d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26e0: 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  rc;..  /* Sanity
26f0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
2700: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
2710: 67 52 65 63 2e 70 67 6e 6f 3e 70 50 61 67 65 72  gRec.pgno>pPager
2720: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 70 67 52 65  ->dbSize || pgRe
2730: 63 2e 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  c.pgno==0 ) retu
2740: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2750: 54 3b 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63  T;..  /* Playbac
2760: 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70 64  k the page.  Upd
2770: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2780: 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61  y copy of the pa
2790: 67 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73  ge.  ** at the s
27a0: 61 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65  ame time, if the
27b0: 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  re is one..  */.
27c0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
27d0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52  okup(pPager, pgR
27e0: 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  ec.pgno);.  if( 
27f0: 70 50 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  pPg ){.    memcp
2800: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
2810: 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74  pPg), pgRec.aDat
2820: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
2830: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  IZE);.    memset
2840: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
2850: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
2860: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 0a 20 20  >nExtra);.  }.  
2870: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65  rc = sqliteOsSee
2880: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
2890: 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 53 51  pgRec.pgno-1)*SQ
28a0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
28b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
28d0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
28e0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65  pPager->fd, pgRe
28f0: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
2900: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a  PAGE_SIZE);.  }.
2910: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2920: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
2930: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
2940: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
2950: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2960: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
2970: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
2980: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
2990: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
29a0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
29b0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
29c0: 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20  follows:  There 
29d0: 69 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a  is an initial.**
29e0: 20 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e   file-type strin
29f0: 67 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  g for sanity che
2a00: 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65  cking.  Then the
2a10: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a  re is a single.*
2a20: 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68  * Pgno number wh
2a30: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
2a40: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a50: 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2a60: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72  e.** changes wer
2a70: 65 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74  e made.  The dat
2a80: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
2a90: 65 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e  ed to this size.
2aa0: 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65  .** Next come ze
2ab0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20  ro or more page 
2ac0: 72 65 63 6f 72 64 73 20 77 68 65 72 65 20 65 61  records where ea
2ad0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a  ch page record.*
2ae0: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2af0: 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f  Pgno and SQLITE_
2b00: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
2b10: 6f 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a  of data.  See.**
2b20: 20 74 68 65 20 50 61 67 65 52 65 63 6f 72 64 20   the PageRecord 
2b30: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65  structure for de
2b40: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tails..**.** If 
2b50: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
2b60: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
2b70: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
2b80: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
2b90: 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74  nal file (as det
2ba0: 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69  ermined by looki
2bb0: 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20  ng at the magic 
2bc0: 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65  number.** at the
2bd0: 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e   beginning) then
2be0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2bf0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f  turns SQLITE_PRO
2c00: 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79  TOCOL..** If any
2c10: 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63   other errors oc
2c20: 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62  cur during playb
2c30: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2c40: 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79  e will.** likely
2c50: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73   be corrupted, s
2c60: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
2c70: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
2c80: 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d  et in.** pPager-
2c90: 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c  >errMask and SQL
2ca0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
2cb0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
2cc0: 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68  all.** works, th
2cd0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2ce0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2cf0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2d00: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2d10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d20: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d40: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
2d50: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2d80: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
2d90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
2da0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
2db0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
2dc0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
2dd0: 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65  char aMagic[size
2de0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2df0: 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  )];.  int rc;.. 
2e00: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2e10: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
2e20: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
2e30: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
2e40: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
2e50: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
2e60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2e70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
2e80: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  n );.  sqliteOsS
2e90: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
2ea0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
2eb0: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
2ec0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65  Pager->jfd, &nRe
2ed0: 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
2ee0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2ef0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
2f00: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
2f10: 6e 52 65 63 20 2d 20 28 73 69 7a 65 6f 66 28 61  nRec - (sizeof(a
2f20: 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67  Magic)+sizeof(Pg
2f30: 6e 6f 29 29 29 20 2f 20 73 69 7a 65 6f 66 28 50  no))) / sizeof(P
2f40: 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  ageRecord);.  if
2f50: 28 20 6e 52 65 63 3c 3d 30 20 29 7b 0a 20 20 20  ( nRec<=0 ){.   
2f60: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
2f70: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
2f80: 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ad the beginning
2f90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2fa0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74 68 65  and truncate the
2fb0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
2fc0: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
2fd0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
2fe0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2ff0: 65 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  eOsRead(&pPager-
3000: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
3010: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
3020: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3030: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
3040: 67 69 63 2c 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  gic,aJournalMagi
3050: 63 2c 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  c,sizeof(aMagic)
3060: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
3070: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
3080: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
3090: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
30a0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
30b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
30c0: 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d 78 50  mxPg, sizeof(mxP
30d0: 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  g));.  if( rc!=S
30e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
3100: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  k;.  }.  rc = sq
3110: 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26  liteOsTruncate(&
3120: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67  pPager->fd, mxPg
3130: 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  *SQLITE_PAGE_SIZ
3140: 45 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  E);.  if( rc!=SQ
3150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
3160: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
3170: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
3180: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
3190: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
31a0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
31b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
31c0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
31d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
31f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3200: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
3210: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
3220: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
3230: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20  ->jfd);.    if( 
3240: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3250: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  break;.  }..end_
3260: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
3270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3280: 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69  .    pager_unwri
3290: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
32a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
32b0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
32c0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
32d0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
32f0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
3300: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
3330: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
3340: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
3350: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
3360: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
3370: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3380: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
3390: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
33a0: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
33b0: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
33c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
33d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33e0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
33f0: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 63  **         the c
3400: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f  heckpoint is sto
3410: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63  red in pPager->c
3420: 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  kptSize, not in 
3430: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
3440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
3450: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
3460: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
3470: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
3480: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
3490: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
34a0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
34b0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
34c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
34d0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
34e0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
34f0: 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  et pPager->ckptJ
3500: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
3510: 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70  int pager_ckpt_p
3520: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
3530: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52  Pager){.  int nR
3540: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
3550: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3560: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
3570: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
3580: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3590: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
35a0: 63 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  c;..  /* Truncat
35b0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
35c0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
35d0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
35e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
35f0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
3600: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  fd, pPager->ckpt
3610: 53 69 7a 65 2a 53 51 4c 49 54 45 5f 50 41 47 45  Size*SQLITE_PAGE
3620: 5f 53 49 5a 45 29 3b 0a 20 20 70 50 61 67 65 72  _SIZE);.  pPager
3630: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
3640: 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a 20 20  r->ckptSize;..  
3650: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
3660: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
3670: 72 65 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70  re in the checkp
3680: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  oint journal..  
3690: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
36a0: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 26 26  ger->ckptOpen &&
36b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36c0: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
36d0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
36e0: 63 70 66 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d  cpfd, 0);.  rc =
36f0: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
3700: 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c  e(&pPager->cpfd,
3710: 20 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   &nRec);.  if( r
3720: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3730: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70      goto end_ckp
3740: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
3750: 20 20 6e 52 65 63 20 2f 3d 20 73 69 7a 65 6f 66    nRec /= sizeof
3760: 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20  (PageRecord);.  
3770: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
3780: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
3790: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
37a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
37b0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
37c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
37d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
37e0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
37f0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
3800: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
3810: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
3820: 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >cpfd);.    if( 
3830: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3840: 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c  goto end_ckpt_pl
3850: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
3860: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
3870: 20 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64   many pages need
3880: 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75   to be copied ou
3890: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
38a0: 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  tion.  ** journa
38b0: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  l..  */.  rc = s
38c0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
38d0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
38e0: 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20  ->ckptJSize);.  
38f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3900: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
3910: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
3920: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
3930: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
3940: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63  ager->jfd, &nRec
3950: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3960: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
3970: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
3980: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63  back;.  }.  nRec
3990: 20 3d 20 28 6e 52 65 63 20 2d 20 70 50 61 67 65   = (nRec - pPage
39a0: 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f 73 69  r->ckptJSize)/si
39b0: 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29  zeof(PageRecord)
39c0: 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  ;.  for(i=nRec-1
39d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
39e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
39f0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
3a00: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
3a10: 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  jfd);.    if( rc
3a20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
3a30: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
3a40: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 0a 0a 65 6e  back;.  }.  ..en
3a50: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3a  d_ckpt_playback:
3a60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3a70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
3a80: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
3a90: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3aa0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
3ab0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  E_CORRUPT;.  }. 
3ac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3ad0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3ae0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
3af0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
3b00: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
3b10: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3b20: 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  tepager_set_cach
3b30: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
3b40: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
3b50: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
3b60: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
3b70: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
3b80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
3b90: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
3ba0: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
3bb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
3bc0: 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20  e into zName.** 
3bd0: 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61  (zName must be a
3be0: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
3bf0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
3c00: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
3c10: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
3c20: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
3c30: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3c40: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
3c50: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
3c60: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
3c70: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
3c80: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
3c90: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
3ca0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
3cb0: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
3cc0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
3cd0: 20 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72   int sqlitepager
3ce0: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
3cf0: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66  zFile, OsFile *f
3d00: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
3d10: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  8;.  int rc;.  d
3d20: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
3d30: 20 20 73 71 6c 69 74 65 4f 73 54 65 6d 70 46 69    sqliteOsTempFi
3d40: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
3d50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
3d60: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46  OpenExclusive(zF
3d70: 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d  ile, fd, 1);.  }
3d80: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
3d90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
3da0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3db0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3dc0: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
3dd0: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
3de0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
3df0: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
3e00: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
3e10: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
3e20: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
3e30: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
3e40: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
3e50: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
3e60: 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  tepager_get() an
3e70: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
3e80: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
3e90: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
3ea0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
3eb0: 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29  itepager_unref()
3ec0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
3ed0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
3ee0: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
3ef0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
3f00: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
3f10: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
3f20: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
3f30: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
3f40: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
3f50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
3f60: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
3f70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
3f80: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
3f90: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
3fa0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
3fb0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
3fc0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
3fd0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3fe0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
3ff0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4000: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
4010: 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20 20 20  int mxPage,     
4020: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20           /* Max 
4030: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
4040: 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
4050: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4070: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
4080: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
4090: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 29 7b  emory page */.){
40a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
40b0: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
40c0: 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20  .  OsFile fd;.  
40d0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 65  int rc;.  int te
40e0: 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 65  mpFile;.  int re
40f0: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68  adOnly = 0;.  ch
4100: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
4110: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
4120: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
4130: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
4140: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
4150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4160: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
4170: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  ( zFilename ){. 
4180: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
4190: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
41a0: 69 6c 65 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  ilename, &fd, &r
41b0: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 74 65  eadOnly);.    te
41c0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 65  mpFile = 0;.  }e
41d0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41e0: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65  litepager_opente
41f0: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
4200: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
4210: 7a 54 65 6d 70 3b 0a 20 20 20 20 74 65 6d 70 46  zTemp;.    tempF
4220: 69 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  ile = 1;.  }.  i
4230: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4240: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4250: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
4260: 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20    }.  nameLen = 
4270: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
4280: 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  );.  pPager = sq
4290: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
42a0: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
42b0: 6d 65 4c 65 6e 2a 32 20 2b 20 33 30 20 29 3b 0a  meLen*2 + 30 );.
42c0: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
42d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43  ){.    sqliteOsC
42e0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72  lose(&fd);.    r
42f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
4300: 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
4310: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
4320: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
4330: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
4340: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
4350: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
4360: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
4370: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
4380: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73   zFilename);.  s
4390: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
43a0: 6f 75 72 6e 61 6c 2c 20 7a 46 69 6c 65 6e 61 6d  ournal, zFilenam
43b0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
43c0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
43d0: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
43e0: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
43f0: 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65  fd = fd;.  pPage
4400: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
4410: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b   0;.  pPager->ck
4420: 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  ptOpen = 0;.  pP
4430: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
4440: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
4450: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
4460: 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b 0a 20  >ckptSize = 0;. 
4470: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
4480: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
4490: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
44a0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
44b0: 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67  mxPage>5 ? mxPag
44c0: 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72  e : 10;.  pPager
44d0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
44e0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
44f0: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
4500: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
4510: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
4520: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
4530: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
4540: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
4550: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
4560: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
4570: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
4580: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
4590: 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65  a = nExtra;.  me
45a0: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
45b0: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
45c0: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
45d0: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
45e0: 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
45f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4600: 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
4610: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
4620: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
4630: 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
4640: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
4650: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
4660: 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
4670: 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
4680: 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
4690: 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
46a0: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
46b0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
46c0: 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
46d0: 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
46e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
46f0: 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
4700: 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
4710: 75 6c 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  ult sqlitepager_
4720: 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  close().  .** De
4730: 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
4740: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
4750: 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29  itepager_unref()
4760: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4770: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
4780: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
4790: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
47a0: 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70 50 61  )(void*)){.  pPa
47b0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
47c0: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
47d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
47e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
47f0: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
4800: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
4810: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a  with.** pPager..
4820: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
4830: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67  er_pagecount(Pag
4840: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4850: 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
4860: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
4870: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
4880: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e>=0 ){.    retu
4890: 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  rn pPager->dbSiz
48a0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  e;.  }.  if( sql
48b0: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
48c0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
48d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
48e0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
48f0: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
4900: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
4910: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c  ;.  }.  n /= SQL
4920: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ITE_PAGE_SIZE;. 
4930: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
4940: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
4950: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
4960: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
4970: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
4980: 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
4990: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
49a0: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
49b0: 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
49c0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
49d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
49e0: 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
49f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4a00: 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
4a10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
4a20: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
4a30: 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
4a40: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
4a50: 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
4a60: 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
4a70: 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
4a80: 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
4a90: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
4aa0: 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
4ab0: 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
4ac0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
4ad0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
4ae0: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
4af0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
4b00: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
4b10: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
4b20: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
4b30: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
4b40: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
4b50: 61 73 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45  ase SQLITE_WRITE
4b60: 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOCK: {.      sq
4b70: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
4b80: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
4b90: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
4ba0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
4bb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
4bc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
4bd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
4be0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4bf0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  se SQLITE_READLO
4c00: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
4c10: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
4c20: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62  er->fd);.      b
4c30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4c40: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4c50: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
4c60: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4c70: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
4c80: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
4c90: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
4ca0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
4cb0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
4cc0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
4cd0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
4ce0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
4cf0: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  d);.  assert( pP
4d00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
4d10: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  n==0 );.  if( pP
4d20: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
4d30: 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 4f  {.    /* sqliteO
4d40: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
4d50: 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 2a 2f 0a 20  zFilename); */. 
4d60: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
4d70: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
4d80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4d90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4da0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
4db0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
4dc0: 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
4dd0: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75  litepager_pagenu
4de0: 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
4df0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
4e00: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
4e10: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
4e20: 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
4e30: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
4e40: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
4e50: 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74  or a page.  If t
4e60: 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 63 75  he page is.** cu
4e70: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
4e80: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
4e90: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
4ea0: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
4eb0: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
4ec0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
4ed0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
4ee0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
4ef0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
4f00: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
4f10: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
4f20: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
4f30: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
4f40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
4f50: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
4f60: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
4f70: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
4f80: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
4f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4fa0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
4fb0: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
4fc0: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
4fd0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
4fe0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
4ff0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
5000: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
5010: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
5020: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
5030: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
5040: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
5050: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
5060: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
5070: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
5080: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
5090: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  }../*.** Increme
50a0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
50b0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
50c0: 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
50d0: 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
50e0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
50f0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
5100: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66   sqlitepager_ref
5110: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
5120: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
5130: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
5140: 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
5150: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
5160: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5170: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
5180: 61 6c 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  al and then writ
5190: 65 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79  e all free dirty
51a0: 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
51b0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 0a  tabase.** file..
51c0: 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61 6c  **.** Writing al
51d0: 6c 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67  l free dirty pag
51e0: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
51f0: 73 65 20 61 66 74 65 72 20 74 68 65 20 73 79 6e  se after the syn
5200: 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62  c is a.** non-ob
5210: 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  vious optimizati
5220: 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20 69 73 20  on.  fsync() is 
5230: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
5240: 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a 20  ration so we.** 
5250: 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  want to minimize
5260: 20 74 68 65 20 6e 75 6d 62 65 72 20 69 74 20 69   the number it i
5270: 73 20 63 61 6c 6c 65 64 2e 20 20 41 66 74 65 72  s called.  After
5280: 20 61 6e 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   an fsync() call
5290: 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66 72 65 65  ,.** we are free
52a0: 20 74 6f 20 77 72 69 74 65 20 64 69 72 74 79 20   to write dirty 
52b0: 70 61 67 65 73 20 62 61 63 6b 20 74 6f 20 74 68  pages back to th
52c0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 74 20  e database.  It 
52d0: 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f  is best.** to go
52e0: 20 61 68 65 61 64 20 61 6e 64 20 77 72 69 74 65   ahead and write
52f0: 20 61 73 20 6d 61 6e 79 20 64 69 72 74 79 20 70   as many dirty p
5300: 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
5310: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 0a 2a 2a   to minimize .**
5320: 20 74 68 65 20 72 69 73 6b 20 6f 66 20 68 61 76   the risk of hav
5330: 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f 74 68 65  ing to do anothe
5340: 72 20 66 73 79 6e 63 28 29 20 6c 61 74 65 72 20  r fsync() later 
5350: 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20 64 69 72  on.  Writing dir
5360: 74 79 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  ty.** free pages
5370: 20 69 6e 20 74 68 69 73 20 77 61 79 20 77 61 73   in this way was
5380: 20 6f 62 73 65 72 76 65 64 20 74 6f 20 6d 61 6b   observed to mak
5390: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 72 61  e database opera
53a0: 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75 70 20 74  tions go.** up t
53b0: 6f 20 31 30 20 74 69 6d 65 73 20 66 61 73 74 65  o 10 times faste
53c0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 61  r..**.** If we a
53d0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 65  re writing to te
53e0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
53f0: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
5400: 65 64 20 74 6f 20 70 72 65 73 65 72 76 65 0a 2a  ed to preserve.*
5410: 2a 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  * the integrity 
5420: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5430: 69 6c 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  ile, so we can s
5440: 61 76 65 20 74 69 6d 65 20 61 6e 64 20 73 6b 69  ave time and ski
5450: 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e 63 28 29  p the.** fsync()
5460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5470: 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 50 61 67  syncAllPages(Pag
5480: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
5490: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
54a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
54b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
54c0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
54d0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
54e0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
54f0: 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28   = sqliteOsSync(
5500: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
5510: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
5520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
5530: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
5540: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
5550: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
5560: 2d 3e 70 46 69 72 73 74 3b 20 70 50 67 3b 20 70  ->pFirst; pPg; p
5570: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  Pg=pPg->pNextFre
5580: 65 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  e){.    if( pPg-
5590: 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
55a0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
55b0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e  ager->fd, (pPg->
55c0: 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50  pgno-1)*SQLITE_P
55d0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
55e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
55f0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
5600: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
5610: 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg), SQLITE_PAGE
5620: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
5630: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5640: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
5650: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
5660: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5670: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
5680: 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
5690: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
56a0: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
56b0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
56c0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
56d0: 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
56e0: 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
56f0: 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
5700: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
5710: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
5720: 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
5730: 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
5740: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
5750: 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
5760: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
5770: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
5780: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
5790: 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
57a0: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
57b0: 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
57c0: 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
57d0: 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
57e0: 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
57f0: 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
5800: 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
5810: 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
5820: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
5830: 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
5840: 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
5850: 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
5860: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
5870: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
5880: 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
5890: 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
58a0: 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
58b0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
58c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
58d0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
58e0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
58f0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
5900: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
5910: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
5920: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
5930: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
5940: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
5950: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
5960: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
5970: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
5980: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
5990: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
59a0: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
59b0: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
59c0: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
59d0: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
59e0: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
59f0: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
5a00: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
5a10: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
5a20: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
5a30: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
5a40: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
5a50: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
5a60: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
5a70: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
5a80: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
5a90: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
5aa0: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
5ab0: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
5ac0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
5ad0: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
5ae0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
5af0: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
5b00: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
5b10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
5b20: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
5b30: 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
5b40: 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  rors..  */ .  if
5b50: 28 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70  ( pPager==0 || p
5b60: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
5b70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5b80: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  R;.  }.  if( pPa
5b90: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
5ba0: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
5bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5bc0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
5bd0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
5be0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
5bf0: 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
5c00: 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72  ed, then get a r
5c10: 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ead lock.  ** on
5c20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5c30: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
5c40: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
5c50: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
5c60: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
5c70: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
5c80: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
5c90: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
5ca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5cb0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  Y;.    }.    pPa
5cc0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
5cd0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20  ITE_READLOCK;.. 
5ce0: 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
5cf0: 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
5d00: 74 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62  try to play it b
5d10: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
5d20: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
5d30: 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
5d40: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
5d50: 20 20 20 69 6e 74 20 72 63 2c 20 64 75 6d 6d 79     int rc, dummy
5d60: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ;..       /* Get
5d70: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
5d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
5d90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
5da0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
5db0: 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  eLock(&pPager->f
5dc0: 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  d);.       if( r
5dd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5de0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
5df0: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  liteOsUnlock(&pP
5e00: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
5e10: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
5e30: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
5e40: 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  0;.         retu
5e50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5e70: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
5e80: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
5e90: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
5ea0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
5eb0: 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
5ec0: 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ss.  Return SQLI
5ed0: 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
5ee0: 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67    ** we cannot g
5ef0: 65 74 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  et exclusive acc
5f00: 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ess to the journ
5f10: 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
5f20: 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 45 76   **.       ** Ev
5f30: 65 6e 20 74 68 6f 75 67 68 20 77 65 20 77 69 6c  en though we wil
5f40: 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61 64 69 6e  l only be readin
5f50: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
5f60: 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c  al, not writing,
5f70: 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61  .       ** we ha
5f80: 76 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ve to open the j
5f90: 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72 69 74 69  ournal for writi
5fa0: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f  ng in order to o
5fb0: 62 74 61 69 6e 20 61 6e 0a 20 20 20 20 20 20 20  btain an.       
5fc0: 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
5fd0: 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ess lock..      
5fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
5ff0: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64  sqliteOsOpenRead
6000: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  Write(pPager->zJ
6010: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
6020: 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  >jfd, &dummy);. 
6030: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
6040: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6050: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
6060: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
6070: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61  >fd);.         a
6080: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6090: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
60a0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
60b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
60c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
60d0: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
60e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
60f0: 20 31 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   1;..       /* P
6100: 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
6110: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
6120: 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
6130: 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
6140: 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
6150: 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
6160: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
6170: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
6180: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
6190: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
61a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
61b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
61c0: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
61d0: 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
61e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
61f0: 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
6200: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
6210: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
6220: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
6230: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
6240: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
6250: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
6260: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
6270: 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
6280: 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65  int h;.    pPage
6290: 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20  r->nMiss++;.    
62a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
62b0: 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
62c0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
62d0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st==0 ){.      /
62e0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
62f0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
6300: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6310: 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
6320: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6330: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
6340: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  a );.      if( p
6350: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
6360: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
6370: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
6380: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6390: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
63a0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
63b0: 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20  R_ERR_MEM;.     
63c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
63d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
63e0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
63f0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
6400: 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
6410: 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
6420: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
6430: 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
6440: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e    pPager->pAll->
6450: 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a  pPrevAll = pPg;.
6460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
6470: 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b  g->pPrevAll = 0;
6480: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
6490: 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
64a0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
64b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
64c0: 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
64d0: 20 6f 6c 64 65 72 20 70 61 67 65 2e 20 20 46 69   older page.  Fi
64e0: 72 73 74 20 6c 6f 63 61 74 65 20 74 68 65 20 70  rst locate the p
64f0: 61 67 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c  age to be recycl
6500: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 72 79  ed..      ** Try
6510: 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20 74 68 61   to find one tha
6520: 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79 20 61  t is not dirty a
6530: 6e 64 20 69 73 20 6e 65 61 72 20 74 68 65 20 68  nd is near the h
6540: 65 61 64 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ead of.      ** 
6550: 6f 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  of the free list
6560: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   */.      int cn
6570: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  t = pPager->mxPa
6580: 67 65 2f 32 3b 0a 20 20 20 20 20 20 70 50 67 20  ge/2;.      pPg 
6590: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
65a0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
65b0: 50 67 2d 3e 64 69 72 74 79 20 26 26 20 30 3c 63  Pg->dirty && 0<c
65c0: 6e 74 2d 2d 20 26 26 20 70 50 67 2d 3e 70 4e 65  nt-- && pPg->pNe
65d0: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
65e0: 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65    pPg = pPg->pNe
65f0: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  xtFree;.      }.
6600: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
6610: 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
6620: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 6e   page that has n
6630: 6f 74 20 62 65 65 6e 20 75 73 65 64 20 72 65 63  ot been used rec
6640: 65 6e 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  ently.      ** a
6650: 6e 64 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  nd which is not 
6660: 64 69 72 74 79 2c 20 74 68 65 6e 20 73 79 6e 63  dirty, then sync
6670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6680: 20 77 72 69 74 65 20 61 6c 6c 0a 20 20 20 20 20   write all.     
6690: 20 2a 2a 20 64 69 72 74 79 20 66 72 65 65 20 70   ** dirty free p
66a0: 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ages into the da
66b0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 75  tabase file, thu
66c0: 73 20 6d 61 6b 69 6e 67 20 74 68 65 6d 0a 20 20  s making them.  
66d0: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 70 61 67      ** clean pag
66e0: 65 73 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  es and available
66f0: 20 66 6f 72 20 72 65 63 79 63 6c 69 6e 67 2e 0a   for recycling..
6700: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
6710: 2a 20 57 65 20 68 61 76 65 20 74 6f 20 73 79 6e  * We have to syn
6720: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
6730: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 20 70  fore writing a p
6740: 61 67 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  age to the main.
6750: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
6760: 65 2e 20 20 42 75 74 20 73 79 6e 63 69 6e 67 20  e.  But syncing 
6770: 69 73 20 61 20 76 65 72 79 20 73 6c 6f 77 20 6f  is a very slow o
6780: 70 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 61 66  peration.  So af
6790: 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ter a.      ** s
67a0: 79 6e 63 2c 20 69 74 20 69 73 20 62 65 73 74 20  ync, it is best 
67b0: 74 6f 20 77 72 69 74 65 20 65 76 65 72 79 74 68  to write everyth
67c0: 69 6e 67 20 77 65 20 63 61 6e 20 62 61 63 6b 20  ing we can back 
67d0: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  to the main.    
67e0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f    ** database to
67f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 72 69   minimize the ri
6800: 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20  sk of having to 
6810: 73 79 6e 63 20 61 67 61 69 6e 20 69 6e 20 74 68  sync again in th
6820: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 61 72 20  e.      ** near 
6830: 66 75 74 75 72 65 2e 20 20 54 68 61 74 20 69 73  future.  That is
6840: 20 77 61 79 20 77 65 20 77 72 69 74 65 20 61 6c   way we write al
6850: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61 66  l dirty pages af
6860: 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ter a.      ** s
6870: 79 6e 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ync..      */.  
6880: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 7c      if( pPg==0 |
6890: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  | pPg->dirty ){.
68a0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
68b0: 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 70 50   syncAllPages(pP
68c0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
68d0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
68e0: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
68f0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
6900: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  r);.          *p
6910: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
6920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6930: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
6940: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20    }.        pPg 
6950: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
6960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6970: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
6980: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  f==0 );.      as
6990: 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
69a0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
69b0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
69c0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
69d0: 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
69e0: 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20  hash table.     
69f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
6a00: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
6a10: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
6a20: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
6a30: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
6a40: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
6a50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6a60: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
6a70: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
6a80: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
6a90: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
6aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6ab0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
6ac0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
6ad0: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
6ae0: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
6af0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
6b00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6b10: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
6b20: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
6b30: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
6b40: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
6b50: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
6b60: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
6b70: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
6b80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
6b90: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
6ba0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
6bb0: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
6bc0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
6bd0: 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  vHash;.      }. 
6be0: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
6bf0: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20  revHash ){.     
6c00: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
6c10: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
6c20: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
6c30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6c40: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
6c50: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
6c60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6c70: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
6c80: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
6c90: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
6ca0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
6cb0: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
6cc0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
6cd0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
6cf0: 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
6d00: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
6d10: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
6d20: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
6d30: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
6d40: 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
6d50: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
6d60: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
6d70: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
6d80: 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
6d90: 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
6da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6db0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
6dc0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
6dd0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
6de0: 70 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  pt && (int)pgno<
6df0: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
6e00: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
6e10: 69 6e 43 6b 70 74 20 3d 20 28 70 50 61 67 65 72  inCkpt = (pPager
6e20: 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38  ->aInCkpt[pgno/8
6e30: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
6e40: 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ))!=0;.    }else
6e50: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  {.      pPg->inC
6e60: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  kpt = 0;.    }. 
6e70: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
6e80: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
6e90: 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
6ea0: 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
6eb0: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
6ec0: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
6ed0: 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
6ee0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
6ef0: 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
6f00: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
6f10: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
6f20: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
6f30: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
6f40: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
6f50: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
6f60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
6f70: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
6f80: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
6f90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
6fa0: 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 70  Size<0 ) sqlitep
6fb0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
6fc0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
6fd0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
6fe0: 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
6ff0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
7000: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
7010: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7020: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7030: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
7040: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26    sqliteOsSeek(&
7050: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
7060: 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45  o-1)*SQLITE_PAGE
7070: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
7080: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
7090: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
70a0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
70b0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
70c0: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
70d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
70e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7110: 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
7120: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
7130: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
7140: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
7150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
7160: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
7170: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
7180: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
7190: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
71a0: 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
71b0: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
71c0: 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
71d0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
71e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
71f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
7200: 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
7210: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
7220: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
7230: 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
7240: 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
7250: 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
7260: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7270: 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
7280: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
7290: 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
72a0: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
72b0: 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  epager_get().  T
72c0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
72d0: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
72e0: 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
72f0: 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
7300: 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
7310: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
7320: 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
7330: 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
7340: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
7350: 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
7360: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
7370: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
7380: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
7390: 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
73a0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
73b0: 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
73c0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
73d0: 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  itepager_lookup(
73e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
73f0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
7400: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d  dr *pPg;..  /* M
7410: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
7420: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
7430: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
7440: 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  */ .  if( pPager
7450: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29  ==0 || pgno==0 )
7460: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7470: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
7480: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
7490: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
74a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
74b0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
74c0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
74d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
74e0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
74f0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
7500: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
7510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
7520: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
7530: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
7540: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
7550: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
7560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
7570: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
7580: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
7590: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
75a0: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
75b0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
75c0: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
75d0: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
75e0: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
75f0: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
7600: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
7610: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
7620: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
7630: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
7640: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
7650: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
7660: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
7670: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
7680: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7690: 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
76a0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
76b0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
76c0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
76d0: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
76e0: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
76f0: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
7700: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
7710: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
7720: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
7730: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
7740: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
7750: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
7760: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
7770: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
7780: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
7790: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
77a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
77b0: 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
77c0: 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
77d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
77e0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
77f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
7800: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
7810: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
7820: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
7830: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
7840: 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
7860: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
7870: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
7880: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
7890: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
78a0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
78b0: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
78c0: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
78d0: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
78e0: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
78f0: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
7900: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
7910: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
7920: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
7930: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
7940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
7950: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
7960: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
7970: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
7980: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
7990: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
79a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
79b0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
79c0: 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
79d0: 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
79e0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
79f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
7a00: 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
7a10: 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
7a20: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
7a30: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
7a40: 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
7a50: 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
7a60: 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
7a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7a80: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
7a90: 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
7aa0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
7ab0: 61 63 71 75 69 72 65 73 20 61 20 77 72 69 74 65  acquires a write
7ac0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
7ad0: 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 77  abase.  If the w
7ae0: 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  rite.** lock cou
7af0: 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
7b00: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
7b10: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
7b20: 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
7b30: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
7b40: 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
7b50: 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
7b60: 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
7b70: 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
7b80: 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
7b90: 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
7ba0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
7bb0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
7bc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
7bd0: 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
7be0: 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
7bf0: 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
7c00: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7c10: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
7c20: 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
7c30: 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
7c40: 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
7c50: 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
7c60: 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
7c70: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
7c80: 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
7c90: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7ca0: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f  pager_commit() o
7cb0: 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  r sqlitepager_ro
7cc0: 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
7cd0: 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eset..*/.int sql
7ce0: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 76  itepager_write(v
7cf0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
7d00: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
7d10: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
7d20: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
7d30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
7d40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7d50: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
7d60: 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
7d70: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7d80: 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
7d90: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
7da0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
7db0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
7dc0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
7dd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
7de0: 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ERM;.  }..  /* M
7df0: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
7e00: 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
7e10: 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
7e20: 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
7e30: 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
7e40: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
7e50: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
7e60: 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74    */.  pPg->dirt
7e70: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  y = 1;.  if( pPg
7e80: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
7e90: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70  pPg->inCkpt || p
7ea0: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 3d  Pager->ckptOpen=
7eb0: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
7ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7ed0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
7ee0: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
7ef0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
7f00: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
7f10: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
7f20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
7f30: 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
7f40: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
7f50: 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
7f60: 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68  **.  ** First ch
7f70: 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
7f80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7f90: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
7fa0: 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69  nd.  ** create i
7fb0: 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
7fc0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7fd0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
7fe0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b  SQLITE_UNLOCK );
7ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
8000: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41  tate==SQLITE_REA
8010: 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  DLOCK ){.    ass
8020: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
8030: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8040: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
8050: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
8060: 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ->fd);.    if( r
8070: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8090: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
80a0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
80b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
80c0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
80d0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50   1 );.    if( pP
80e0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
80f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8100: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
8110: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
8120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8130: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
8140: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70   rc = sqliteOsOp
8150: 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
8160: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
8170: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
8180: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8190: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
81a0: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
81b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
81c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
81d0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
81e0: 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c     sqliteOsReadL
81f0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
8200: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8210: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
8220: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
8230: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
8240: 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  1;.    pPager->n
8250: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
8260: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8270: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
8280: 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  K;.    sqlitepag
8290: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
82a0: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
82b0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
82c0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
82d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
82e0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
82f0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
8300: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
8310: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 69  alMagic));.    i
8320: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8330: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
8340: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
8350: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
8360: 65 72 2d 3e 64 62 53 69 7a 65 2c 20 73 69 7a 65  er->dbSize, size
8370: 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  of(Pgno));.    }
8380: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
83a0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
83b0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
83c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
83d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
83e0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
83f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8400: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
8410: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
8420: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
8430: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8440: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8450: 6e 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  n );..  /* The t
8460: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
8470: 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
8480: 64 20 77 65 20 68 61 76 65 20 61 20 77 72 69 74  d we have a writ
8490: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
84a0: 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  ** main database
84b0: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
84c0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
84d0: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
84e0: 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  n .  ** journal 
84f0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
8500: 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f  re already..  */
8510: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
8520: 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
8530: 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
8540: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
8550: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8560: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
8570: 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67 6e  ->jfd, &pPg->pgn
8580: 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  o, sizeof(Pgno))
8590: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
85a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
85b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
85c0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
85d0: 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , pData, SQLITE_
85e0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
85f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
8600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8610: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
8620: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
8630: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
8640: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
8650: 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65  R_FULL;.      re
8660: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8670: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8680: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
8690: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
86a0: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
86b0: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
86c0: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
86d0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
86e0: 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 1;.    pPg->
86f0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
8700: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
8710: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  kptOpen ){.     
8720: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
8730: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
8740: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
8750: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
8760: 43 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Ckpt = 1;.    }.
8770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
8780: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
8790: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
87a0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
87b0: 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  in it,.  ** then
87c0: 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
87d0: 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  nt page to the c
87e0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
87f0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
8800: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 26  ager->ckptOpen &
8810: 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26  & !pPg->inCkpt &
8820: 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
8830: 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  <=pPager->ckptSi
8840: 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
8850: 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
8860: 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
8870: 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
8880: 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  bSize );.    rc 
8890: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
88a0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26  &pPager->cpfd, &
88b0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 73 69 7a 65 6f  pPg->pgno, sizeo
88c0: 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66  f(Pgno));.    if
88d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
88e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
88f0: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
8900: 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61 74 61  ger->cpfd, pData
8910: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
8920: 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ZE);.    }.    i
8930: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8940: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8950: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
8960: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
8970: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
8980: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
8990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
89a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
89b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  rt( pPager->aInC
89c0: 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  kpt!=0 );.    pP
89d0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50  ager->aInCkpt[pP
89e0: 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
89f0: 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
8a00: 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20      pPg->inCkpt 
8a10: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
8a20: 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
8a30: 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
8a40: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
8a50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
8a60: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
8a70: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
8a80: 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
8a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8ab0: 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
8ac0: 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
8ad0: 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
8ae0: 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
8af0: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
8b00: 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  write().  In oth
8b10: 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
8b20: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
8b30: 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
8b40: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
8b50: 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e page..*/.int s
8b60: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69  qlitepager_iswri
8b70: 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
8b80: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
8b90: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
8ba0: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
8bb0: 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
8bc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
8bd0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
8be0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
8bf0: 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
8c00: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
8c10: 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
8c20: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
8c30: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
8c40: 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
8c50: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
8c60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
8c70: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
8c80: 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
8c90: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
8ca0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
8cb0: 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
8cc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
8cd0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
8ce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
8cf0: 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
8d00: 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
8d10: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
8d20: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
8d30: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8d40: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
8d50: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
8d60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8d70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
8d80: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
8d90: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
8da0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
8db0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8dc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8dd0: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
8de0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
8df0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8e00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
8e10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8e20: 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n );.  if( pPage
8e30: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26 26 20 73  r->needSync && s
8e40: 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61  qliteOsSync(&pPa
8e50: 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54  ger->jfd)!=SQLIT
8e60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
8e70: 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
8e80: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
8e90: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8ea0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
8eb0: 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
8ec0: 3e 64 69 72 74 79 3d 3d 30 20 29 20 63 6f 6e 74  >dirty==0 ) cont
8ed0: 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  inue;.    rc = s
8ee0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
8ef0: 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70  ger->fd, (pPg->p
8f00: 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41  gno-1)*SQLITE_PA
8f10: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  GE_SIZE);.    if
8f20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8f30: 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62  ) goto commit_ab
8f40: 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ort;.    rc = sq
8f50: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
8f60: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
8f70: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
8f80: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
8f90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8fa0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
8fb0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
8fc0: 20 69 66 28 20 73 71 6c 69 74 65 4f 73 53 79 6e   if( sqliteOsSyn
8fd0: 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d  c(&pPager->fd)!=
8fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
8ff0: 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
9000: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
9010: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
9020: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
9030: 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
9040: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
9050: 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67  here if anything
9060: 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69   goes wrong duri
9070: 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
9080: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d  ocess..  */.comm
9090: 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d  it_abort:.  rc =
90a0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
90b0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
90c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
90d0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
90e0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
90f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9100: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
9110: 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
9120: 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
9130: 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c  back to read-onl
9140: 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  y mode..** All i
9150: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
9160: 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
9170: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
9180: 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
9190: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
91a0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
91b0: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
91c0: 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
91d0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
91e0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
91f0: 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
9200: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
9210: 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
9220: 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
9230: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
9240: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
9250: 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
9260: 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
9270: 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
9280: 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
9290: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
92a0: 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
92b0: 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
92c0: 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
92d0: 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
92e0: 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
92f0: 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
9300: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
9310: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
9320: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
9330: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
9340: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
9350: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
9360: 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
9370: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
9380: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
9390: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
93a0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
93b0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
93c0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
93d0: 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
93e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
93f0: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  K;.  }.  rc = pa
9400: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
9410: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
9420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9430: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
9440: 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72  RUPT;.    pPager
9450: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
9460: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
9470: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
9480: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
9490: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
94a0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
94b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
94c0: 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
94d0: 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
94e0: 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
94f0: 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
9500: 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
9510: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
9520: 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
9530: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9540: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
9550: 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
9560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9570: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
9580: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
9590: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
95a0: 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73  qlitepager_stats
95b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95c0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
95d0: 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  9];.  a[0] = pPa
95e0: 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
95f0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
9600: 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
9610: 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
9620: 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
9630: 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
9640: 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
9650: 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
9660: 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20  rMask;.  a[6] = 
9670: 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
9680: 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
9690: 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
96a0: 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
96b0: 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a  return a;.}../*.
96c0: 2a 2a 20 53 65 74 20 74 68 65 20 63 68 65 63 6b  ** Set the check
96d0: 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
96e0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
96f0: 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
9700: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9710: 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
9720: 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
9730: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
9740: 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
9750: 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
9760: 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
9770: 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
9780: 65 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  e command within
9790: 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
97a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
97b0: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62  litepager_ckpt_b
97c0: 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
97d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
97e0: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
97f0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
9800: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9810: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
9820: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
9830: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
9840: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
9850: 43 6b 70 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Ckpt = sqliteMal
9860: 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
9870: 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
9880: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
9890: 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pt==0 ){.    sql
98a0: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
98b0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
98c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
98d0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
98e0: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
98f0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
9900: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
9910: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
9920: 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
9930: 61 69 6c 65 64 3b 0a 20 20 70 50 61 67 65 72 2d  ailed;.  pPager-
9940: 3e 63 6b 70 74 53 69 7a 65 20 3d 20 70 50 61 67  >ckptSize = pPag
9950: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 72 63  er->dbSize;.  rc
9960: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f   = sqlitepager_o
9970: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
9980: 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20  pPager->cpfd);. 
9990: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
99a0: 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  kpt_begin_failed
99b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
99c0: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Open = 1;.  retu
99d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
99e0: 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  ckpt_begin_faile
99f0: 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
9a00: 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20  >aInCkpt ){.    
9a10: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
9a20: 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20  r->aInCkpt);.   
9a30: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
9a40: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
9a50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9a60: 43 6f 6d 6d 69 74 20 61 20 63 68 65 63 6b 70 6f  Commit a checkpo
9a70: 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
9a80: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d  tepager_ckpt_com
9a90: 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
9aa0: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
9ab0: 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20  ->ckptOpen ){.  
9ac0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
9ad0: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
9ae0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a  &pPager->cpfd);.
9af0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
9b00: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71  Open = 0;.    sq
9b10: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
9b20: 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20  ->aInCkpt );.   
9b30: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
9b40: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
9b50: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
9b60: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
9b70: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
9b80: 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a  Pg->inCkpt = 0;.
9b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9bb0: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
9bc0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f  a checkpoint..*/
9bd0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
9be0: 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _ckpt_rollback(P
9bf0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9c00: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
9c10: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
9c20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
9c30: 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28  r_ckpt_playback(
9c40: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
9c50: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f  itepager_ckpt_co
9c60: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
9c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
9c80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
9ca0: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  if SQLITE_TEST./
9cb0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
9cc0: 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
9cd0: 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
9ce0: 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
9cf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9d00: 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
9d10: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9d20: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
9d30: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
9d40: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
9d50: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
9d60: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
9d70: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9d80: 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25    printf("PAGE %
9d90: 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  3d addr=0x%08x n
9da0: 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
9db0: 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69     pPg->pgno, (i
9dc0: 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
9dd0: 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
9de0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.