/ Hex Artifact Content
Login

Artifact 103341600b4044e41b5bd95cd3850f046b976ff2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 38  : pager.c,v 1.48
0350: 20 32 30 30 32 2f 30 37 2f 30 36 20 31 36 3a 32   2002/07/06 16:2
0360: 38 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a  8:48 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 63 68 61 72 20 61 6c 77 61 79 73 52 6f 6c    char alwaysRol
0d90: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
0da0: 20 2f 2a 20 49 67 6e 6f 72 65 20 64 6f 6e 74 5f   /* Ignore dont_
0db0: 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 73  rollback() calls
0dc0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 2f 2a   if true */.  /*
0dd0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
0de0: 45 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  E bytes of page 
0df0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
0e00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
0e10: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
0e20: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
0e30: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
0e40: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
0e50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
0e60: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
0e70: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
0e80: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
0e90: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
0ea0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
0eb0: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
0ec0: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
0ed0: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
0ee0: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
0ef0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
0f00: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
0f10: 54 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26  TRA(P) ((void*)&
0f20: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
0f30: 29 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ))[SQLITE_PAGE_S
0f40: 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77  IZE])../*.** How
0f50: 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65   big to make the
0f60: 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64   hash table used
0f70: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e   for locating in
0f80: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a  -memory pages.**
0f90: 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
0fa0: 20 20 4b 6e 75 74 68 20 73 61 79 73 20 74 68 69    Knuth says thi
0fb0: 73 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70 72  s should be a pr
0fc0: 69 6d 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23  ime number..*/.#
0fd0: 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48  define N_PG_HASH
0fe0: 20 32 30 30 33 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f   2003../*.** A o
0ff0: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
1000: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1010: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1020: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1030: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
1040: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1060: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1070: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
1080: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
1090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
10a0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10b0: 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  ile */.  OsFile 
10c0: 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20  fd, jfd;        
10d0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
10e0: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74  criptors for dat
10f0: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
1100: 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 63 70  l */.  OsFile cp
1110: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1120: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1130: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 63 68  iptor for the ch
1140: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1150: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
1160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1170: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1180: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1190: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
11a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
11b0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
11c0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
11d0: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63  hange */.  int c
11e0: 6b 70 74 53 69 7a 65 2c 20 63 6b 70 74 4a 53 69  kptSize, ckptJSi
11f0: 7a 65 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ze;    /* Size o
1200: 66 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  f database and j
1210: 6f 75 72 6e 61 6c 20 61 74 20 63 6b 70 74 5f 62  ournal at ckpt_b
1220: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
1230: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1240: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1250: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1260: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1270: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1280: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
1290: 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  oid*); /* Call t
12a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
12b0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
12c0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
12f0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
1300: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
1310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1320: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1330: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1340: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
1350: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
1360: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1370: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
1380: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1390: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
13a0: 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  */.  int nHit, n
13b0: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
13c0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
13d0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
13e0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
13f0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
1400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1410: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
1420: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1430: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
1440: 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20 20   ckptOpen;      
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1460: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f  e if the checkpo
1470: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  int journal is o
1480: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  pen */.  u8 ckpt
1490: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
14a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
14b0: 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b 70 6f  are in a checkpo
14c0: 69 6e 74 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  int */.  u8 noSy
14d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
14e0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
14f0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1500: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
1510: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
1520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1530: 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44  TE_UNLOCK, _READ
1540: 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f  LOCK or _WRITELO
1550: 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61  CK */.  u8 errMa
1560: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1570: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
1580: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
1590: 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65  rrors */.  u8 te
15a0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
15b0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
15c0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
15d0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
15e0: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
15f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1600: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
1610: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
1620: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1640: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
1650: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
1660: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1670: 38 20 64 69 72 74 79 46 69 6c 65 3b 20 20 20 20  8 dirtyFile;    
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1690: 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  ue if database f
16a0: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
16b0: 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a 20 20  in any way */.  
16c0: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16e0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
16f0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1700: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
1710: 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20  8 *aInCkpt;     
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
1730: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
1740: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1750: 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ase */.  PgHdr *
1760: 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20  pFirst, *pLast; 
1770: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1780: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
1790: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17b0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
17c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
17d0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
17e0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
17f0: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
1800: 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a 7d  er of PgHdr */.}
1810: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
1820: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
1830: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
1840: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
1850: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
1860: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
1870: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
1880: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
1890: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
18a0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
18b0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
18c0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
18d0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
18e0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
18f0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
1900: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1910: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
1920: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
1930: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
1940: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
1950: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
1960: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
1970: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
1980: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
1990: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ve? */../*.** Th
19a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
19b0: 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72 65 63  ontains page rec
19c0: 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ords in the foll
19d0: 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 2e  owing.** format.
19e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19f0: 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50 61  ct PageRecord Pa
1a00: 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63 74  geRecord;.struct
1a10: 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20 20   PageRecord {.  
1a20: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a40: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1a50: 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44 61 74  r */.  char aDat
1a60: 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  a[SQLITE_PAGE_SI
1a70: 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ZE];  /* Origina
1a80: 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  l data for page 
1a90: 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  pgno */.};../*.*
1aa0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
1ab0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
1ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
1ad0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
1ae0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
1af0: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
1b00: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
1b10: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
1b20: 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  check..*/.static
1b30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1b40: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
1b50: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
1b60: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
1b70: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
1b80: 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 0a 2f  x63, 0xd4,.};../
1b90: 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65  *.** Hash a page
1ba0: 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69   number.*/.#defi
1bb0: 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e  ne pager_hash(PN
1bc0: 29 20 20 28 28 50 4e 29 25 4e 5f 50 47 5f 48 41  )  ((PN)%N_PG_HA
1bd0: 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  SH)../*.** Enabl
1be0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1bf0: 74 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a  t tracking here:
1c00: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1c10: 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 5f  EST.  int pager_
1c20: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
1c30: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
1c40: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
1c50: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
1c60: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
1c70: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
1c80: 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  r_refinfo_enable
1c90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1ca0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
1cb0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
1cc0: 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e  0x%08x nRef=%d\n
1cd0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
1ce0: 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f  o, (int)PGHDR_TO
1cf0: 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65  _DATA(p), p->nRe
1d00: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
1d10: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
1d20: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
1d30: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
1d40: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
1d50: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
1d60: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
1d70: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
1d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1d90: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
1da0: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
1db0: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
1dc0: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
1dd0: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
1de0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
1df0: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
1e00: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1e10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1e20: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
1e30: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
1e40: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
1e50: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
1e60: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
1e70: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
1e80: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
1e90: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
1ea0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
1eb0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
1ec0: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
1ed0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
1ee0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1ef0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
1f00: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
1f10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
1f20: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
1f30: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
1f40: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
1f50: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
1f60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f70: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
1f80: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
1f90: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
1fa0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
1fb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1fc0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
1fd0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1fe0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
1ff0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
2000: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
2010: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
2020: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
2030: 5b 70 67 6e 6f 20 25 20 4e 5f 50 47 5f 48 41 53  [pgno % N_PG_HAS
2040: 48 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  H];.  while( p &
2050: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
2060: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
2070: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
2080: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2090: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
20a0: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
20b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
20c0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
20d0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
20e0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
20f0: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
2100: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
2110: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
2120: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
2130: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
2140: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
2150: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
2160: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
2170: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
2180: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
2190: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
21a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
21b0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
21c0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
21d0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
21e0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
21f0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
2200: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
2210: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
2220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2230: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
2240: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2250: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
2260: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
2270: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
2280: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2290: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
22a0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
22b0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
22c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22d0: 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52  state>=SQLITE_WR
22e0: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  ITELOCK ){.    s
22f0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
2300: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
2310: 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63  .  sqliteOsUnloc
2320: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
2330: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
2340: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
2350: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
2360: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
2370: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73  ->nRef = 0;.  as
2380: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2390: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
23a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
23b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
23c0: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
23d0: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
23e0: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
23f0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
2400: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c  This routine rel
2420: 65 61 73 65 73 20 74 68 65 20 64 61 74 61 62 61  eases the databa
2430: 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  se.** write lock
2440: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
2450: 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73  read lock in its
2460: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
2470: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
2480: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
2490: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24a0: 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  t pager_unwritel
24b0: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
24c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
24d0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66  PgHdr *pPg;.  if
24e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
24f0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
2500: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2510: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 70 61 67  _OK;.  sqlitepag
2520: 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70  er_ckpt_commit(p
2530: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
2540: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29  ager->ckptOpen )
2550: 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c  {.    sqliteOsCl
2560: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66  ose(&pPager->cpf
2570: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
2580: 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  ckptOpen = 0;.  
2590: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73  }.  sqliteOsClos
25a0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
25b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
25c0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71  alOpen = 0;.  sq
25d0: 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61  liteOsDelete(pPa
25e0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
25f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
2600: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
2610: 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  >fd);.  sqliteFr
2620: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
2630: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
2640: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
2650: 20 30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50   0;.  for(pPg=pP
2660: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
2670: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
2680: 6c 6c 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  ll){.    pPg->in
2690: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
26a0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
26b0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
26c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
26e0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
26f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2700: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
2710: 61 70 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65  appen if a proce
2720: 73 73 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c  ss does a BEGIN,
2730: 20 74 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20   then forks and 
2740: 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
2750: 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68   process does th
2760: 65 20 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75  e COMMIT.  Becau
2770: 73 65 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74  se of the semant
2780: 69 63 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20  ics of unix.    
2790: 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  ** file locking,
27a0: 20 74 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c   the unlock will
27b0: 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   fail..    */.  
27c0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27d0: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
27e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
2800: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
2810: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
2820: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
2830: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
2840: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
2850: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
2860: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2870: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
2880: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
2890: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 29  er, OsFile *jfd)
28a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
28b0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
28c0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
28d0: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
28e0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67  e cache */.  Pag
28f0: 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 0a  eRecord pgRec;..
2900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
2910: 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2c  ead(jfd, &pgRec,
2920: 20 73 69 7a 65 6f 66 28 70 67 52 65 63 29 29 3b   sizeof(pgRec));
2930: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2940: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2950: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
2960: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
2970: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 67 52  age */.  if( pgR
2980: 65 63 2e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  ec.pgno>pPager->
2990: 64 62 53 69 7a 65 20 7c 7c 20 70 67 52 65 63 2e  dbSize || pgRec.
29a0: 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
29b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
29c0: 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20  ..  /* Playback 
29d0: 74 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74  the page.  Updat
29e0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
29f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65  copy of the page
2a00: 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d  .  ** at the sam
2a10: 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65  e time, if there
2a20: 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   is one..  */.  
2a30: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
2a40: 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63  up(pPager, pgRec
2a50: 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50  .pgno);.  if( pP
2a60: 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  g ){.    memcpy(
2a70: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
2a80: 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c  g), pgRec.aData,
2a90: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
2aa0: 45 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 50  E);.    memset(P
2ab0: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
2ac0: 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  g), 0, pPager->n
2ad0: 45 78 74 72 61 29 3b 0a 20 20 7d 0a 20 20 72 63  Extra);.  }.  rc
2ae0: 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28   = sqliteOsSeek(
2af0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
2b00: 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49  Rec.pgno-1)*SQLI
2b10: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
2b20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b30: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
2b40: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
2b50: 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e  ager->fd, pgRec.
2b60: 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  aData, SQLITE_PA
2b70: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  GE_SIZE);.  }.  
2b80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b90: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
2ba0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
2bb0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
2bc0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
2bd0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
2be0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
2bf0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
2c00: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
2c10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2c20: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
2c30: 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73  llows:  There is
2c40: 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66   an initial.** f
2c50: 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20  ile-type string 
2c60: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
2c70: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65  ing.  Then there
2c80: 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   is a single.** 
2c90: 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63  Pgno number whic
2ca0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
2cb0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2cc0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2cd0: 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20  ** changes were 
2ce0: 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62  made.  The datab
2cf0: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
2d00: 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a   to this size..*
2d10: 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f  * Next come zero
2d20: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65   or more page re
2d30: 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68  cords where each
2d40: 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20   page record.** 
2d50: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67  consists of a Pg
2d60: 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41  no and SQLITE_PA
2d70: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
2d80: 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74   data.  See.** t
2d90: 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74  he PageRecord st
2da0: 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61  ructure for deta
2db0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ils..**.** If th
2dc0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
2dd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2de0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
2df0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
2e00: 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74 65 72  l file (as deter
2e10: 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  mined by looking
2e20: 20 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e 75   at the magic nu
2e30: 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  mber.** at the b
2e40: 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74  eginning) then t
2e50: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2e60: 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  rns SQLITE_PROTO
2e70: 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  COL..** If any o
2e80: 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63 75  ther errors occu
2e90: 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61 63  r during playbac
2ea0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
2eb0: 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62  will.** likely b
2ec0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20  e corrupted, so 
2ed0: 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  the PAGER_ERR_CO
2ee0: 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65 74  RRUPT bit is set
2ef0: 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65   in.** pPager->e
2f00: 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49 54  rrMask and SQLIT
2f10: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
2f20: 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c  urned.  If it al
2f30: 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e  l.** works, then
2f40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2f50: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2f70: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
2f80: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f90: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fb0: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
2fc0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2fe0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2ff0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
3000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3010: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
3020: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
3030: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
3040: 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66  ar aMagic[sizeof
3050: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
3060: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
3070: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
3080: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
3090: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30a0: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
30b0: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
30c0: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
30d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
30e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
30f0: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65  );.  sqliteOsSee
3100: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
3110: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
3120: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
3130: 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29  ger->jfd, &nRec)
3140: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3150: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
3160: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
3170: 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e 52    }.  nRec = (nR
3180: 65 63 20 2d 20 28 73 69 7a 65 6f 66 28 61 4d 61  ec - (sizeof(aMa
3190: 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f  gic)+sizeof(Pgno
31a0: 29 29 29 20 2f 20 73 69 7a 65 6f 66 28 50 61 67  ))) / sizeof(Pag
31b0: 65 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20  eRecord);.  if( 
31c0: 6e 52 65 63 3c 3d 30 20 29 7b 0a 20 20 20 20 67  nRec<=0 ){.    g
31d0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
31e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
31f0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
3200: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
3210: 64 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  d truncate the. 
3220: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
3230: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
3240: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
3250: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  /.  rc = sqliteO
3260: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a  sRead(&pPager->j
3270: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
3280: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
3290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32a0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
32b0: 63 2c 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  c,aJournalMagic,
32c0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
32d0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
32e0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
32f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
3300: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  yback;.  }.  rc 
3310: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26  = sqliteOsRead(&
3320: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78  pPager->jfd, &mx
3330: 50 67 2c 20 73 69 7a 65 6f 66 28 6d 78 50 67 29  Pg, sizeof(mxPg)
3340: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
3360: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
3370: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
3380: 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  teOsTruncate(&pP
3390: 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67 2a 53  ager->fd, mxPg*S
33a0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
33b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
33c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
33d0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
33e0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
33f0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
3400: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
3410: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
3420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
3430: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
3440: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
3450: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
3460: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3470: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
3480: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
3490: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
34a0: 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  jfd);.    if( rc
34b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
34c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c  eak;.  }..end_pl
34d0: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
34e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34f0: 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65     pager_unwrite
3500: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
3510: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
3520: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
3530: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
3540: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
3550: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
3560: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
3570: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
3580: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3590: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
35a0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
35b0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
35c0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
35d0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
35e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
35f0: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
3600: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
3610: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
3620: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
3630: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
3650: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
3660: 20 20 20 20 20 20 20 20 20 74 68 65 20 63 68 65           the che
3670: 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f 72 65  ckpoint is store
3680: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70  d in pPager->ckp
3690: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
36a0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
36b0: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
36c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
36d0: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
36e0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
36f0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
3700: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
3710: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
3720: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
3730: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
3740: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
3750: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
3760: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
3770: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
3780: 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61  t pager_ckpt_pla
3790: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
37a0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65 63  ger){.  int nRec
37b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
37d0: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
37e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3800: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
3810: 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20  ..  /* Truncate 
3820: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
3830: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
3840: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
3850: 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e  c = sqliteOsTrun
3860: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
3870: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  , pPager->ckptSi
3880: 7a 65 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ze*SQLITE_PAGE_S
3890: 49 5a 45 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  IZE);.  pPager->
38a0: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
38b0: 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >ckptSize;..  /*
38c0: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
38d0: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
38e0: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
38f0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
3900: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
3910: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
3920: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
3930: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f  pen );.  sqliteO
3940: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63  sSeek(&pPager->c
3950: 70 66 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  pfd, 0);.  rc = 
3960: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
3970: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
3980: 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  &nRec);.  if( rc
3990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
39a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
39b0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
39c0: 20 6e 52 65 63 20 2f 3d 20 73 69 7a 65 6f 66 28   nRec /= sizeof(
39d0: 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 0a  PageRecord);.  .
39e0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
39f0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
3a00: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
3a10: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
3a20: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
3a30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
3a40: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
3a50: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3a60: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
3a70: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
3a80: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
3a90: 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cpfd);.    if( r
3aa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
3ab0: 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61  oto end_ckpt_pla
3ac0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
3ad0: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
3ae0: 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20  many pages need 
3af0: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  to be copied out
3b00: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
3b10: 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ion.  ** journal
3b20: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
3b30: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
3b40: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
3b50: 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >ckptJSize);.  i
3b60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3b70: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
3b80: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
3b90: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
3ba0: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
3bb0: 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63 29  ger->jfd, &nRec)
3bc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3bd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
3be0: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
3bf0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20  ack;.  }.  nRec 
3c00: 3d 20 28 6e 52 65 63 20 2d 20 70 50 61 67 65 72  = (nRec - pPager
3c10: 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f 73 69 7a  ->ckptJSize)/siz
3c20: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
3c30: 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b  .  for(i=nRec-1;
3c40: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
3c50: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
3c60: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
3c70: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
3c80: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
3c90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
3ca0: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
3cb0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 0a 0a 65 6e 64  ack;.  }.  ..end
3cc0: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _ckpt_playback:.
3cd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3ce0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
3cf0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
3d00: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
3d10: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3d20: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
3d30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3d40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
3d50: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3d60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3d70: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
3d80: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  d..**.** The max
3d90: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74  imum number is t
3da0: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3db0: 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20  e of the mxPage 
3dc0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66  parameter..** If
3dd0: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
3de0: 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20  ive, the noSync 
3df0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74  flag is also set
3e00: 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73  .  noSync bypass
3e10: 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  es.** calls to s
3e20: 71 6c 69 74 65 4f 73 53 79 6e 63 28 29 2e 20 20  qliteOsSync().  
3e30: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
3e40: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
3e50: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
3e60: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
3e70: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
3e80: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
3e90: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
3ea0: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
3eb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
3ec0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
3ed0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
3ee0: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
3ef0: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
3f00: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73  id sqlitepager_s
3f10: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
3f20: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
3f30: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
3f40: 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  xPage>=0 ){.    
3f50: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
3f60: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
3f70: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3f80: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
3f90: 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d   1;.    mxPage =
3fa0: 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20   -mxPage;.  }.  
3fb0: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
3fc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
3fd0: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
3fe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
3ff0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
4000: 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  .  Write the nam
4010: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
4020: 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61  to zName.** (zNa
4030: 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  me must be at le
4040: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
4050: 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c  AME_SIZE bytes l
4060: 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20  ong.)  Write.** 
4070: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
4080: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
4090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
40a0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
40b0: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
40c0: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
40d0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
40e0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
40f0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
4100: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
4110: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
4120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4130: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
4140: 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c  ntemp(char *zFil
4150: 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a  e, OsFile *fd){.
4160: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
4170: 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20   int rc;.  do{. 
4180: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
4190: 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61  liteOsTempFileNa
41a0: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
41b0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
41c0: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
41d0: 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c   fd, 1);.  }whil
41e0: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
41f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
4200: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4210: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
4220: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
4230: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
4240: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
4250: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
4260: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
4270: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
4280: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
4290: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
42a0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
42b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61  call to sqlitepa
42c0: 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73  ger_get() and is
42d0: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
42e0: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
42f0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
4300: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 70  ed using sqlitep
4310: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
4320: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
4330: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
4340: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
4350: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
4360: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
4370: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
4380: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
4390: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
43a0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
43b0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
43c0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
43d0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
43e0: 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  open(.  Pager **
43f0: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
4400: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
4410: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
4420: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
4430: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
4440: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4450: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4460: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
4470: 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  mxPage,         
4480: 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62       /* Max numb
4490: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
44a0: 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20  cache pages */. 
44b0: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
44d0: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
44e0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
44f0: 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 50  y page */.){.  P
4500: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
4510: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
4520: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
4530: 72 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69  rc;.  int tempFi
4540: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e  le;.  int readOn
4550: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
4560: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
4570: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
4580: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
4590: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
45a0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
45b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
45c0: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
45d0: 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 72  ilename ){.    r
45e0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
45f0: 52 65 61 64 57 72 69 74 65 28 7a 46 69 6c 65 6e  ReadWrite(zFilen
4600: 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f  ame, &fd, &readO
4610: 6e 6c 79 29 3b 0a 20 20 20 20 74 65 6d 70 46 69  nly);.    tempFi
4620: 6c 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  le = 0;.  }else{
4630: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4640: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
4650: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
4660: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
4670: 70 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  p;.    tempFile 
4680: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  = 1;.  }.  if( r
4690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
46a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
46b0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
46c0: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
46d0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  en(zFilename);. 
46e0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
46f0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
4700: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
4710: 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69 66  n*2 + 30 );.  if
4720: 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ( pPager==0 ){. 
4730: 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65     sqliteOsClose
4740: 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72  (&fd);.    retur
4750: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4760: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46    }.  pPager->zF
4770: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
4780: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
4790: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
47a0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
47b0: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
47c0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
47d0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 69  ->zFilename, zFi
47e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  lename);.  strcp
47f0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
4800: 61 6c 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  al, zFilename);.
4810: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
4820: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
4830: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
4840: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
4850: 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   fd;.  pPager->j
4860: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
4870: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
4880: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
4890: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b  ->ckptInUse = 0;
48a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
48b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
48c0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
48d0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d  ager->ckptSize =
48e0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b   0;.  pPager->ck
48f0: 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  ptJSize = 0;.  p
4900: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
4910: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
4920: 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20  ge = mxPage>5 ? 
4930: 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70  mxPage : 10;.  p
4940: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
4950: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  QLITE_UNLOCK;.  
4960: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4970: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74  = 0;.  pPager->t
4980: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
4990: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  le;.  pPager->re
49a0: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
49b0: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
49c0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
49d0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
49e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
49f0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
4a00: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
4a10: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
4a20: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
4a30: 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70  xtra;.  memset(p
4a40: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
4a50: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
4a60: 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61  aHash));.  *ppPa
4a70: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
4a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
4aa0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
4ab0: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
4ac0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
4ad0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
4ae0: 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
4af0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4b00: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
4b10: 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
4b20: 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
4b30: 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
4b40: 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
4b50: 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
4b60: 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
4b70: 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
4b80: 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
4b90: 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
4ba0: 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
4bb0: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
4bc0: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
4bd0: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
4be0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70 61 67  led by sqlitepag
4bf0: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
4c00: 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  oid sqlitepager_
4c10: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
4c20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
4c30: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
4c40: 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  *)){.  pPager->x
4c50: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
4c60: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  sc;.}../*.** Ret
4c70: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
4c80: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4c90: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
4ca0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
4cb0: 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  * pPager..*/.int
4cc0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
4cd0: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
4ce0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  ager){.  int n;.
4cf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4d00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
4d10: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
4d20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
4d30: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
4d40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46  .  if( sqliteOsF
4d50: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
4d60: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
4d70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4d80: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
4d90: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
4da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4db0: 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41    n /= SQLITE_PA
4dc0: 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70  GE_SIZE;.  if( p
4dd0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
4de0: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  LITE_UNLOCK ){. 
4df0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
4e00: 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  e = n;.  }.  ret
4e10: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
4e20: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
4e30: 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
4e40: 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
4e50: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
4e60: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
4e70: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
4e80: 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
4e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4ea0: 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
4eb0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
4ec0: 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
4ed0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
4ee0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
4ef0: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
4f00: 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
4f10: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
4f20: 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
4f30: 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
4f40: 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
4f50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
4f60: 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
4f70: 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
4f80: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
4f90: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c  t sqlitepager_cl
4fa0: 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
4fb0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
4fc0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74  , *pNext;.  swit
4fd0: 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
4fe0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
4ff0: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20  LITE_WRITELOCK: 
5000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61  {.      sqlitepa
5010: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
5020: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
5030: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
5040: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
5050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
5060: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
5070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5080: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
5090: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a  ITE_READLOCK: {.
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e        sqliteOsUn
50b0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
50c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
50d0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
50e0: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
50f0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
5100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5110: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
5120: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
5130: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
5140: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
5150: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
5160: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
5170: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
5180: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
5190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
51a0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
51b0: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
51c0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
51d0: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
51e0: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
51f0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
5200: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
5210: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
5220: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
5230: 2a 20 7d 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  * }.  */.  sqlit
5240: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
5250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5260: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
5270: 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
5280: 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
5290: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
52a0: 67 6e 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f  gno sqlitepager_
52b0: 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
52c0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
52d0: 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
52e0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
52f0: 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
5300: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
5310: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
5320: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
5330: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
5340: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e  .** currently on
5350: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
5360: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
5370: 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
5380: 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
5390: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
53a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
53b0: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
53c0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
53d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
53e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
53f0: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
5400: 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
5410: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
5420: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
5430: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
5440: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
5450: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
5460: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
5470: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
5480: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
5490: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
54a0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
54b0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
54c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
54d0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
54e0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
54f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
5500: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
5510: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
5520: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
5530: 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
5540: 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
5550: 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
5560: 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pPg);.}../*.** I
5570: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
5580: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
5590: 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
55a0: 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
55b0: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
55c0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
55d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
55e0: 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
55f0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
5600: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
5610: 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
5620: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
5630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5640: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
5650: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
5660: 6e 20 77 72 69 74 65 20 61 6c 6c 20 66 72 65 65  n write all free
5670: 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
5680: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
5690: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
56a0: 69 6e 67 20 61 6c 6c 20 66 72 65 65 20 64 69 72  ing all free dir
56b0: 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
56c0: 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 74  database after t
56d0: 68 65 20 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20  he sync is a.** 
56e0: 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69  non-obvious opti
56f0: 6d 69 7a 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63  mization.  fsync
5700: 28 29 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  () is an expensi
5710: 76 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20  ve operation so 
5720: 77 65 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69  we.** want to mi
5730: 6e 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65  nimize the numbe
5740: 72 20 6f 74 20 74 69 6d 65 73 20 69 74 20 69 73  r ot times it is
5750: 20 63 61 6c 6c 65 64 2e 20 41 66 74 65 72 20 61   called. After a
5760: 6e 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2c 0a  n fsync() call,.
5770: 2a 2a 20 77 65 20 61 72 65 20 66 72 65 65 20 74  ** we are free t
5780: 6f 20 77 72 69 74 65 20 64 69 72 74 79 20 70 61  o write dirty pa
5790: 67 65 73 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ges back to the 
57a0: 64 61 74 61 62 61 73 65 2e 20 20 49 74 20 69 73  database.  It is
57b0: 20 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61   best.** to go a
57c0: 68 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 61  head and write a
57d0: 73 20 6d 61 6e 79 20 64 69 72 74 79 20 70 61 67  s many dirty pag
57e0: 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  es as possible t
57f0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74  o minimize .** t
5800: 68 65 20 72 69 73 6b 20 6f 66 20 68 61 76 69 6e  he risk of havin
5810: 67 20 74 6f 20 64 6f 20 61 6e 6f 74 68 65 72 20  g to do another 
5820: 66 73 79 6e 63 28 29 20 6c 61 74 65 72 20 6f 6e  fsync() later on
5830: 2e 20 20 57 72 69 74 69 6e 67 20 64 69 72 74 79  .  Writing dirty
5840: 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
5850: 6e 20 74 68 69 73 20 77 61 79 20 77 61 73 20 6f  n this way was o
5860: 62 73 65 72 76 65 64 20 74 6f 20 6d 61 6b 65 20  bserved to make 
5870: 64 61 74 61 62 61 73 65 20 6f 70 65 72 61 74 69  database operati
5880: 6f 6e 73 20 67 6f 0a 2a 2a 20 75 70 20 74 6f 20  ons go.** up to 
5890: 31 30 20 74 69 6d 65 73 20 66 61 73 74 65 72 2e  10 times faster.
58a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  .**.** If we are
58b0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 65 6d 70   writing to temp
58c0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2c 20  orary database, 
58d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
58e0: 20 74 6f 20 70 72 65 73 65 72 76 65 0a 2a 2a 20   to preserve.** 
58f0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
5900: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5910: 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
5920: 65 20 74 69 6d 65 20 61 6e 64 20 73 6b 69 70 20  e time and skip 
5930: 74 68 65 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 0a  the.** fsync()..
5940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
5950: 6e 63 41 6c 6c 50 61 67 65 73 28 50 61 67 65 72  ncAllPages(Pager
5960: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
5970: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
5980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5990: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
59a0: 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
59b0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
59c0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
59d0: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
59e0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
59f0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
5a00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
5a10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
5a20: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Sync = 0;.  }.  
5a30: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
5a40: 70 46 69 72 73 74 3b 20 70 50 67 3b 20 70 50 67  pFirst; pPg; pPg
5a50: 3d 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 29  =pPg->pNextFree)
5a60: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64  {.    if( pPg->d
5a70: 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 73 71  irty ){.      sq
5a80: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
5a90: 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67  er->fd, (pPg->pg
5aa0: 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47  no-1)*SQLITE_PAG
5ab0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  E_SIZE);.      r
5ac0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
5ad0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
5ae0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
5af0: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
5b00: 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
5b10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5b20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 50 67  break;.      pPg
5b30: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
5b40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5b50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
5b60: 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
5b70: 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
5b80: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
5b90: 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
5ba0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
5bb0: 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
5bc0: 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
5bd0: 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
5be0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
5bf0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
5c00: 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
5c10: 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
5c20: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
5c30: 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
5c40: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
5c50: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
5c60: 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
5c70: 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
5c80: 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
5c90: 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
5ca0: 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
5cb0: 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
5cc0: 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
5cd0: 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
5ce0: 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
5cf0: 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
5d00: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
5d10: 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
5d20: 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
5d30: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
5d40: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
5d50: 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
5d60: 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
5d70: 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
5d80: 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
5d90: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
5da0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
5db0: 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
5dc0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
5dd0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
5de0: 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  litepager_lookup
5df0: 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
5e00: 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
5e10: 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
5e20: 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
5e30: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
5e40: 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
5e50: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
5e60: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
5e70: 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
5e80: 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
5e90: 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
5ea0: 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
5eb0: 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
5ec0: 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
5ed0: 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
5ee0: 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
5ef0: 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
5f00: 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
5f10: 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
5f20: 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
5f30: 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
5f40: 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
5f50: 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
5f60: 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
5f70: 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
5f80: 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
5f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
5fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
5fb0: 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
5fc0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
5fd0: 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
5fe0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
5ff0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
6000: 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
6010: 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
6020: 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  rs..  */ .  if( 
6030: 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e  pPager==0 || pgn
6040: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
6050: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
6070: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50  r->errMask & ~(P
6080: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29  AGER_ERR_FULL) )
6090: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
60a0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
60b0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
60c0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
60d0: 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
60e0: 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72 65 61  , then get a rea
60f0: 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  d lock.  ** on t
6100: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
6120: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
6130: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73      if( sqliteOs
6140: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
6150: 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ->fd)!=SQLITE_OK
6160: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
6170: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
6180: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
6190: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
61a0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
61b0: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20  E_READLOCK;..   
61c0: 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
61d0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72   file exists, tr
61e0: 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  y to play it bac
61f0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  k..    */.    if
6200: 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45 78  ( sqliteOsFileEx
6210: 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
6220: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
6230: 20 69 6e 74 20 72 63 2c 20 64 75 6d 6d 79 3b 0a   int rc, dummy;.
6240: 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
6250: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
6260: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
6270: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
6280: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c  = sqliteOsWriteL
6290: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
62a0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
62b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
62c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
62d0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
62e0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
62f0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
6300: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
6310: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
6320: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
6330: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
6350: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
6360: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
6370: 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
6380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
6390: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
63a0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
63b0: 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
63c0: 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74  ** we cannot get
63d0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
63e0: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
63f0: 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
6400: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  *.       ** Even
6410: 20 74 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20   though we will 
6420: 6f 6e 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20  only be reading 
6430: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6440: 2c 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20  , not writing,. 
6450: 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65        ** we have
6460: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
6470: 72 6e 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67  rnal for writing
6480: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74   in order to obt
6490: 61 69 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a  ain an.       **
64a0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
64b0: 73 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  s lock..       *
64c0: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
64d0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
64e0: 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ite(pPager->zJou
64f0: 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
6500: 66 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  fd, &dummy);.   
6510: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6520: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55    rc = sqliteOsU
6540: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
6550: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73  d);.         ass
6560: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
6570: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a  OK );.         *
6580: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
6590: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
65a0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
65b0: 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
65c0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
65d0: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;..       /* Pla
65e0: 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
65f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
6600: 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
6610: 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a   write.       **
6620: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
6630: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
6640: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
6650: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
6660: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
6670: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
6680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
66a0: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  .       }.    }.
66b0: 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
66c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
66d0: 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20  rch for page in 
66e0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67  cache */.    pPg
66f0: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
6700: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
6710: 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
6720: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
6730: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
6740: 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
6750: 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
6760: 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
6770: 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
6780: 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
6790: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
67a0: 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
67b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
67c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
67d0: 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d  e */.      pPg =
67e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
67f0: 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51  izeof(*pPg) + SQ
6800: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b  LITE_PAGE_SIZE +
6810: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
6820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
6830: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
6840: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
6850: 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74      pager_unwrit
6860: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
6870: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
6880: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
6890: 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  ERR_MEM;.       
68a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
68b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
68c0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
68d0: 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20  = pPager;.      
68e0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
68f0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
6900: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6910: 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
6920: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50  pPager->pAll->pP
6930: 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  revAll = pPg;.  
6940: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
6950: 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20  >pPrevAll = 0;. 
6960: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
6970: 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70  l = pPg;.      p
6980: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
6990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
69a0: 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 6f   /* Recycle an o
69b0: 6c 64 65 72 20 70 61 67 65 2e 20 20 46 69 72 73  lder page.  Firs
69c0: 74 20 6c 6f 63 61 74 65 20 74 68 65 20 70 61 67  t locate the pag
69d0: 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c 65 64  e to be recycled
69e0: 2e 0a 20 20 20 20 20 20 2a 2a 20 54 72 79 20 74  ..      ** Try t
69f0: 6f 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20  o find one that 
6a00: 69 73 20 6e 6f 74 20 64 69 72 74 79 20 61 6e 64  is not dirty and
6a10: 20 69 73 20 6e 65 61 72 20 74 68 65 20 68 65 61   is near the hea
6a20: 64 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f 66  d of.      ** of
6a30: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 2a   the free list *
6a40: 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  /.      pPg = pP
6a50: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
6a60: 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
6a70: 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
6a80: 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
6a90: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
6aa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6ab0: 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
6ac0: 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
6ad0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73   has not been us
6ae0: 65 64 20 72 65 63 65 6e 74 6c 79 0a 20 20 20 20  ed recently.    
6af0: 20 20 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 69    ** and which i
6b00: 73 20 6e 6f 74 20 64 69 72 74 79 2c 20 74 68 65  s not dirty, the
6b10: 6e 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  n sync the journ
6b20: 61 6c 20 61 6e 64 20 77 72 69 74 65 20 61 6c 6c  al and write all
6b30: 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 74 79 20  .      ** dirty 
6b40: 66 72 65 65 20 70 61 67 65 73 20 69 6e 74 6f 20  free pages into 
6b50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6b60: 65 2c 20 74 68 75 73 20 6d 61 6b 69 6e 67 20 74  e, thus making t
6b70: 68 65 6d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65  hem.      ** cle
6b80: 61 6e 20 70 61 67 65 73 20 61 6e 64 20 61 76 61  an pages and ava
6b90: 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 63 79 63  ilable for recyc
6ba0: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ling..      **. 
6bb0: 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
6bc0: 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
6bd0: 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69  nal before writi
6be0: 6e 67 20 61 20 70 61 67 65 20 74 6f 20 74 68 65  ng a page to the
6bf0: 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 64   main.      ** d
6c00: 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 73 79  atabase.  But sy
6c10: 6e 63 69 6e 67 20 69 73 20 61 20 76 65 72 79 20  ncing is a very 
6c20: 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2e 20  slow operation. 
6c30: 20 53 6f 20 61 66 74 65 72 20 61 0a 20 20 20 20   So after a.    
6c40: 20 20 2a 2a 20 73 79 6e 63 2c 20 69 74 20 69 73    ** sync, it is
6c50: 20 62 65 73 74 20 74 6f 20 77 72 69 74 65 20 65   best to write e
6c60: 76 65 72 79 74 68 69 6e 67 20 77 65 20 63 61 6e  verything we can
6c70: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6d 61 69   back to the mai
6c80: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  n.      ** datab
6c90: 61 73 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ase to minimize 
6ca0: 74 68 65 20 72 69 73 6b 20 6f 66 20 68 61 76 69  the risk of havi
6cb0: 6e 67 20 74 6f 20 73 79 6e 63 20 61 67 61 69 6e  ng to sync again
6cc0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
6cd0: 20 6e 65 61 72 20 66 75 74 75 72 65 2e 20 20 54   near future.  T
6ce0: 68 61 74 20 69 73 20 77 61 79 20 77 65 20 77 72  hat is way we wr
6cf0: 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
6d00: 67 65 73 20 61 66 74 65 72 20 61 0a 20 20 20 20  ges after a.    
6d10: 20 20 2a 2a 20 73 79 6e 63 2e 0a 20 20 20 20 20    ** sync..     
6d20: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
6d30: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
6d40: 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c  int rc = syncAll
6d50: 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  Pages(pPager);. 
6d60: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
6d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6d80: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
6d90: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
6da0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
6db0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0;.          ret
6dc0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6dd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6de0: 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
6df0: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
6e00: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
6e10: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
6e20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
6e30: 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
6e40: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20        /* Unlink 
6e50: 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
6e60: 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
6e70: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
6e80: 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
6e90: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6ea0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
6eb0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
6ec0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
6ed0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
6ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ef0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6f00: 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
6f10: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
6f20: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
6f30: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
6f40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
6f50: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
6f60: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
6f70: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
6f80: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
6f90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
6fb0: 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
6fc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
6fd0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
6fe0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
6ff0: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
7000: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
7010: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 20  pPrevFree = 0;. 
7020: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e       if( pPg->pN
7030: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
7040: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
7050: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
7060: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
7070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7080: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
7090: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
70a0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
70b0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
70c0: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65 6c  tHash;.      }el
70d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  se{.        h = 
70e0: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
70f0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
7100: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
7110: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
7120: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
7130: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
7140: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20  pNextHash;.     
7150: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e   }.      pPg->pN
7160: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
7170: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
7180: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66      pPager->nOvf
7190: 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  l++;.    }.    p
71a0: 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
71b0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
71c0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
71d0: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
71e0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
71f0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
7200: 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
7210: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
7220: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
7230: 29 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73  )))!=0;.    }els
7240: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
7250: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
7260: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7270: 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20 28 69  r->aInCkpt && (i
7280: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
7290: 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20  >ckptSize ){.   
72a0: 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d     pPg->inCkpt =
72b0: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70   (pPager->aInCkp
72c0: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
72d0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
72e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72f0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pPg->inCkpt = 0;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
7310: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  dirty = 0;.    p
7320: 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
7330: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
7340: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
7350: 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65  ++;.    h = page
7360: 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20  r_hash(pgno);.  
7370: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
7380: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7390: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
73a0: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
73b0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
73c0: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
73d0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
73e0: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
73f0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
7400: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
7410: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
7420: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
7430: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
7440: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
7450: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
7460: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7470: 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f  dbSize<(int)pgno
7480: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7490: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
74a0: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
74b0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
74c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
74d0: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
74e0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
74f0: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 53 51 4c  fd, (pgno-1)*SQL
7500: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
7510: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7520: 65 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  eOsRead(&pPager-
7530: 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
7540: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
7550: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
7560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7570: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
7580: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7590: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
75a0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
75b0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
75c0: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
75d0: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
75e0: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
75f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7600: 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
7610: 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
7620: 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
7630: 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
7640: 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
7650: 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
7660: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
7670: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
7680: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7690: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
76a0: 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
76b0: 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
76c0: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
76d0: 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
76e0: 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
76f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
7700: 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
7710: 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
7720: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
7730: 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
7740: 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  so sqlitepager_g
7750: 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
7760: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
7770: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
7780: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  d sqlitepager_ge
7790: 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
77a0: 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
77b0: 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
77c0: 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
77d0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
77e0: 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
77f0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
7800: 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
7810: 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
7820: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
7830: 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
7840: 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
7850: 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76  r happened..*/.v
7860: 6f 69 64 20 2a 73 71 6c 69 74 65 70 61 67 65 72  oid *sqlitepager
7870: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7890: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
78a0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
78b0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
78c0: 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
78d0: 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  rors..  */ .  if
78e0: 28 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70  ( pPager==0 || p
78f0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
7900: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7910: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
7920: 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
7930: 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
7940: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
7950: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
7960: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7970: 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
7980: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
7990: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
79a0: 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
79b0: 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
79c0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g);.  return PGH
79d0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
79e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
79f0: 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
7a00: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
7a10: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
7a20: 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
7a30: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
7a40: 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
7a50: 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
7a60: 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
7a70: 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
7a80: 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
7a90: 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
7aa0: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
7ab0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7ac0: 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
7ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
7ae0: 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
7af0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
7b00: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
7b10: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7b20: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
7b30: 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
7b40: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
7b50: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
7b60: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
7b70: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
7b80: 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
7b90: 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
7ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
7bb0: 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
7bc0: 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
7bd0: 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
7be0: 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
7bf0: 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
7c00: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
7c10: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
7c20: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
7c30: 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
7c40: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7c50: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
7c60: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
7c70: 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
7c80: 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
7c90: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
7ca0: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
7cb0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
7cc0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
7cd0: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
7ce0: 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
7cf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
7d00: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
7d10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7d20: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
7d30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
7d40: 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 29  estructor(pData)
7d50: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
7d60: 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
7d70: 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
7d80: 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
7d90: 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
7da0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7db0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
7dc0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
7dd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
7de0: 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
7df0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7e00: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7e10: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
7e20: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
7e30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7e40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
7e50: 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
7e60: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7e70: 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
7e80: 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
7e90: 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
7ea0: 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
7eb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
7ec0: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
7ed0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
7ee0: 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72    *  sqlitepager
7ef0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
7f00: 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
7f10: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
7f20: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
7f30: 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65     *  sqlitepage
7f40: 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c  r_unref() is cal
7f50: 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
7f60: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7f70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
7f80: 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
7f90: 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
7fa0: 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
7fb0: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
7fc0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
7fd0: 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
7fe0: 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
7ff0: 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
8000: 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61  .** to acquire a
8010: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8020: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
8030: 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
8040: 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c  t there.** is al
8050: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
8060: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
8070: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8080: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
8090: 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64  ady write-locked
80a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
80b0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
80c0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65  t sqlitepager_be
80d0: 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29  gin(void *pData)
80e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
80f0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
8100: 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
8110: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
8120: 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
8130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
8140: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
8150: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8160: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
8170: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  LITE_UNLOCK );. 
8180: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8190: 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c  te==SQLITE_READL
81a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
81b0: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
81c0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
81d0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
81e0: 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  teLock(&pPager->
81f0: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
8200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8210: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8220: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
8230: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
8240: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
8250: 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
8260: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
8270: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
8280: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8290: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
82a0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
82b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
82c0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  MEM;.    }.    r
82d0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e  c = sqliteOsOpen
82e0: 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
82f0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
8300: 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d  ger->jfd,pPager-
8310: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
8320: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8330: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8340: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
8350: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  nJournal);.     
8360: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
8370: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  nal = 0;.      s
8380: 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28  qliteOsReadLock(
8390: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
83a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83b0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
83c0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  }.    pPager->jo
83d0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
83e0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
83f0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
8400: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
8410: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8420: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57  state = SQLITE_W
8430: 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 73 71  RITELOCK;.    sq
8440: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
8450: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
8460: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8470: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
8480: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
8490: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
84a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
84b0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
84c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
84d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
84e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
84f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
8500: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
8510: 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
8520: 65 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  e, sizeof(Pgno))
8530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8540: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8550: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
8560: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
8570: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
8580: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
85a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
85b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
85c0: 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
85d0: 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
85e0: 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
85f0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
8600: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
8610: 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
8620: 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
8630: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
8640: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
8650: 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
8660: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
8670: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
8680: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8690: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
86a0: 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
86b0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
86c0: 75 69 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f  uires a write lo
86d0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
86e0: 73 65 2e 20 20 49 66 20 74 68 65 20 77 72 69 74  se.  If the writ
86f0: 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  e.** lock could 
8700: 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
8710: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8720: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
8730: 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
8740: 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
8750: 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
8760: 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
8770: 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
8780: 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
8790: 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
87a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
87b0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
87c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
87d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
87e0: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
87f0: 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
8800: 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
8810: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8820: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
8830: 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
8840: 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
8850: 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
8860: 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
8870: 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
8880: 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
8890: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
88a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67  all to sqlitepag
88b0: 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73  er_commit() or s
88c0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
88d0: 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
88e0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
88f0: 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
8900: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
8910: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
8920: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
8930: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
8940: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
8950: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8960: 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
8970: 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
8980: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
8990: 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
89a0: 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
89b0: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
89c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
89d0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
89e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
89f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
8a00: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
8a10: 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
8a20: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
8a30: 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
8a40: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
8a50: 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
8a60: 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
8a70: 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
8a80: 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
8a90: 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
8aa0: 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70 50 61 67  ->inCkpt || pPag
8ab0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 3d 3d 30  er->ckptInUse==0
8ac0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
8ad0: 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a  >dirtyFile = 1;.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
8b00: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
8b10: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
8b20: 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
8b30: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74   to be.  ** writ
8b40: 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
8b50: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
8b60: 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
8b70: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72   journal.  ** or
8b80: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
8b90: 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
8ba0: 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
8bb0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
8bc0: 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a   exists and.  **
8bd0: 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
8be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   does not..  */.
8bf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
8c00: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
8c10: 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  UNLOCK );.  rc =
8c20: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67   sqlitepager_beg
8c30: 69 6e 28 70 44 61 74 61 29 3b 0a 20 20 70 50 61  in(pData);.  pPa
8c40: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
8c50: 20 31 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   1;.  if( rc!=SQ
8c60: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8c70: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
8c80: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
8c90: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
8ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8cb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8cc0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61  );..  /* The tra
8cd0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
8ce0: 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
8cf0: 77 65 20 68 61 76 65 20 61 20 77 72 69 74 65 20  we have a write 
8d00: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
8d10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
8d20: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
8d30: 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
8d40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8d50: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66  .  ** journal if
8d60: 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
8d70: 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20   already..  */. 
8d80: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
8d90: 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
8da0: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
8db0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
8dc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
8dd0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
8de0: 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67 6e 6f 2c  jfd, &pPg->pgno,
8df0: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a   sizeof(Pgno));.
8e00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8e10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
8e20: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
8e30: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
8e40: 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
8e50: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
8e60: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8e70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
8e80: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
8e90: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
8ea0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
8eb0: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
8ec0: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75  FULL;.      retu
8ed0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8ee0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8ef0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
8f00: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
8f10: 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
8f20: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
8f30: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
8f40: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8f50: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
8f60: 63 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  c;.    pPg->inJo
8f70: 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
8f80: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
8f90: 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
8fa0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50  ager->aInCkpt[pP
8fb0: 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
8fc0: 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
8fd0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70        pPg->inCkp
8fe0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
8ff0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68  ..  /* If the ch
9000: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
9010: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
9020: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
9030: 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72  it,.  ** then wr
9040: 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
9050: 70 61 67 65 20 74 6f 20 74 68 65 20 63 68 65 63  page to the chec
9060: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
9070: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9080: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
9090: 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20  !pPg->inCkpt && 
90a0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
90b0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
90c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
90d0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
90e0: 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
90f0: 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
9100: 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ize );.    rc = 
9110: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
9120: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 26 70 50  Pager->cpfd, &pP
9130: 67 2d 3e 70 67 6e 6f 2c 20 73 69 7a 65 6f 66 28  g->pgno, sizeof(
9140: 50 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20  Pgno));.    if( 
9150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9160: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9170: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
9180: 72 2d 3e 63 70 66 64 2c 20 70 44 61 74 61 2c 20  r->cpfd, pData, 
9190: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
91a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
91b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
91c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61  {.      sqlitepa
91d0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
91e0: 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
91f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
9200: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
9210: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9220: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9230: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
9240: 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
9250: 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d  er->aInCkpt[pPg-
9260: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
9270: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
9280: 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20    pPg->inCkpt = 
9290: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  1;.  }..  /* Upd
92a0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
92b0: 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
92c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
92d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
92e0: 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
92f0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9300: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
9310: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9320: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
9330: 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
9340: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
9350: 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
9360: 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
9370: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72  o sqlitepager_wr
9380: 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
9390: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
93a0: 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
93b0: 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
93c0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
93d0: 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
93e0: 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74 65  itepager_iswrite
93f0: 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
9400: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
9410: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
9420: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
9430: 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
9440: 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
9450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
9460: 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
9470: 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
9480: 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
9490: 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
94a0: 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
94b0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
94c0: 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
94d0: 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
94e0: 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
94f0: 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
9500: 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
9510: 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
9520: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
9530: 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
9540: 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
9550: 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
9560: 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
9570: 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
9580: 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
9590: 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
95a0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
95b0: 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
95c0: 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
95d0: 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
95e0: 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
95f0: 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72  litepager_dont_r
9600: 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
9610: 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
9620: 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
9630: 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
9640: 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
9650: 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
9660: 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
9670: 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
9680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9690: 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
96a0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
96b0: 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
96c0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
96d0: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  to sqlitepager_d
96e0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
96f0: 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
9700: 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
9710: 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
9720: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
9730: 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
9740: 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
9750: 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
9760: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9770: 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
9780: 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
9790: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
97a0: 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
97b0: 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
97c0: 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
97d0: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
97e0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
97f0: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
9800: 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
9810: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
9820: 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
9830: 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
9840: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9850: 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
9860: 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
9870: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
9880: 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
9890: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
98a0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
98b0: 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
98c0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
98d0: 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
98e0: 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
98f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
9900: 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
9910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
9920: 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
9930: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
9940: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
9950: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
9960: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
9970: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9980: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
9990: 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
99a0: 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
99b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
99c0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
99d0: 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
99e0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
99f0: 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
9a00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
9a10: 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
9a20: 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
9a30: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
9a40: 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
9a50: 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
9a60: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
9a70: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
9a80: 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
9a90: 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
9aa0: 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
9ab0: 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
9ac0: 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
9ad0: 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
9ae0: 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
9af0: 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
9b00: 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
9b10: 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
9b20: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
9b30: 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
9b40: 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
9b50: 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
9b60: 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
9b70: 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
9b80: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
9b90: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
9ba0: 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
9bb0: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
9bc0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
9bd0: 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
9be0: 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
9bf0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
9c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
9c10: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
9c20: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9c30: 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
9c40: 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
9c50: 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
9c60: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
9c70: 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
9c80: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
9c90: 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
9ca0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
9cb0: 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
9cc0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
9cd0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
9ce0: 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
9cf0: 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
9d00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
9d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9d20: 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
9d30: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
9d40: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
9d50: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
9d60: 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
9d70: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
9d80: 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
9d90: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
9da0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20  TE_WRITELOCK || 
9db0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9dc0: 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
9dd0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
9de0: 79 73 52 6f 6c 6c 62 61 63 6b 20 29 20 72 65 74  ysRollback ) ret
9df0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
9e00: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
9e10: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
9e20: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
9e30: 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
9e40: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
9e50: 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
9e60: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
9e70: 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
9e80: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
9e90: 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
9ea0: 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
9eb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  if( pPager->ckpt
9ec0: 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
9ed0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
9ee0: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
9ef0: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
9f00: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b  .      pPg->inCk
9f10: 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  pt = 1;.    }.  
9f20: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
9f30: 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70 50  ckptInUse && !pP
9f40: 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e  g->inCkpt && (in
9f50: 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
9f60: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b  ger->ckptSize ){
9f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
9f80: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
9f90: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
9fa0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
9fb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9fc0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21  pPager->aInCkpt!
9fd0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
9fe0: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
9ff0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
a000: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
a010: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b  pPg->inCkpt = 1;
a020: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
a030: 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
a040: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
a050: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
a060: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
a070: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
a080: 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
a090: 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
a0a0: 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
a0b0: 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
a0c0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a0d0: 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
a0e0: 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
a0f0: 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
a100: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
a110: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  tepager_commit(P
a120: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a130: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
a140: 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
a150: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50  ager->errMask==P
a160: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
a170: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a180: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
a190: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
a1a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
a1b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
a1c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
a1d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
a1e0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
a1f0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
a200: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
a210: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a220: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
a230: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
a240: 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
a250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a260: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
a270: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
a280: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28  nalOpen );.  if(
a290: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
a2a0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  le==0 ){.    /* 
a2b0: 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68  Exit early (with
a2c0: 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69  out doing the ti
a2d0: 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c  me-consuming sql
a2e0: 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  iteOsSync() call
a2f0: 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
a300: 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
a310: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
a320: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
a330: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
a340: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
a350: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
a360: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
a370: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
a380: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
a390: 65 65 64 53 79 6e 63 20 26 26 20 73 71 6c 69 74  eedSync && sqlit
a3a0: 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  eOsSync(&pPager-
a3b0: 3e 6a 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  >jfd)!=SQLITE_OK
a3c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
a3d0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
a3e0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
a3f0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
a400: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
a410: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72      if( pPg->dir
a420: 74 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ty==0 ) continue
a430: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
a440: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
a450: 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d  >fd, (pPg->pgno-
a460: 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  1)*SQLITE_PAGE_S
a470: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63  IZE);.    if( rc
a480: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a490: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
a4a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a4b0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
a4c0: 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
a4d0: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
a4e0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
a4f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a500: 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
a510: 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  abort;.  }.  if(
a520: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
a530: 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79 6e 63   && sqliteOsSync
a540: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53  (&pPager->fd)!=S
a550: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a560: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
a570: 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  t;.  }.  rc = pa
a580: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
a590: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
a5a0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
a5b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20    return rc;..  
a5c0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
a5d0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
a5e0: 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63  ong during the c
a5f0: 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20  ommit process.. 
a600: 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74   */.commit_abort
a610: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  :.  rc = sqlitep
a620: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
a630: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  ager);.  if( rc=
a640: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a650: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
a660: 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
a670: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
a680: 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
a690: 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
a6a0: 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
a6b0: 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a  read-only mode..
a6c0: 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
a6d0: 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
a6e0: 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
a6f0: 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
a700: 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
a710: 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
a720: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a730: 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
a740: 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
a750: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
a760: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
a770: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
a780: 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
a790: 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
a7a0: 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
a7b0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
a7c0: 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
a7d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a7e0: 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
a7f0: 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
a800: 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
a810: 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
a820: 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
a830: 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
a840: 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
a850: 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
a860: 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
a870: 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
a880: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
a890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
a8a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
a8b0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
a8c0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
a8d0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
a8e0: 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
a8f0: 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
a900: 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
a910: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c  ager->state>=SQL
a920: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b  ITE_WRITELOCK ){
a930: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
a940: 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
a950: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
a960: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
a970: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
a980: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
a990: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
a9a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a9b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
a9c0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
a9d0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
a9e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a9f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
aa00: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
aa10: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
aa20: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
aa30: 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  RRUPT;.  }.  pPa
aa40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
aa50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
aa60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
aa70: 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
aa80: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
aa90: 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
aaa0: 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
aab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
aac0: 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
aad0: 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
aae0: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65 61  qlitepager_isrea
aaf0: 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
ab00: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
ab10: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
ab20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ab30: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
ab40: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
ab50: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
ab60: 0a 69 6e 74 20 2a 73 71 6c 69 74 65 70 61 67 65  .int *sqlitepage
ab70: 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
ab80: 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
ab90: 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30   int a[9];.  a[0
aba0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
abb0: 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
abc0: 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
abd0: 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
abe0: 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
abf0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
ac00: 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
ac10: 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
ac20: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
ac30: 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
ac40: 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
ac50: 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
ac60: 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
ac70: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  vfl;.  return a;
ac80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ac90: 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2a  e checkpoint..**
aca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
acb0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
acc0: 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
acd0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
ace0: 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
acf0: 20 41 20 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e   A new checkpoin
ad00: 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
ad10: 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
ad20: 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
ad30: 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
ad40: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
ad50: 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
ad60: 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
ad70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
ad80: 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69 6e 28  ager_ckpt_begin(
ad90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ada0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
adb0: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
adc0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
add0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ade0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
adf0: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
ae00: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20  ->ckptInUse );. 
ae10: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
ae20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
ae30: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
ae40: 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
ae50: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d  Pager->aInCkpt==
ae60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f  0 ){.    sqliteO
ae70: 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65  sReadLock(&pPage
ae80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75  r->fd);.    retu
ae90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
aea0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
aeb0: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
aec0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
aed0: 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a  er->ckptJSize);.
aee0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
aef0: 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  ckpt_begin_faile
af00: 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  d;.  pPager->ckp
af10: 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
af20: 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70  dbSize;.  if( !p
af30: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
af40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
af50: 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  tepager_opentemp
af60: 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d  (zTemp, &pPager-
af70: 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >cpfd);.    if( 
af80: 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62  rc ) goto ckpt_b
af90: 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
afa0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
afb0: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  n = 1;.  }.  pPa
afc0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d  ger->ckptInUse =
afd0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
afe0: 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b 70 74 5f 62  ITE_OK;. .ckpt_b
aff0: 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
b000: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
b010: 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pt ){.    sqlite
b020: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
b030: 43 6b 70 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Ckpt);.    pPage
b040: 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a  r->aInCkpt = 0;.
b050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
b070: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a   a checkpoint..*
b080: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
b090: 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 50 61  r_ckpt_commit(Pa
b0a0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b0b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  if( pPager->ckpt
b0c0: 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
b0d0: 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 73 71 6c  dr *pPg;.    sql
b0e0: 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70  iteOsTruncate(&p
b0f0: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
b100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
b110: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
b120: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
b130: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20  er->aInCkpt );. 
b140: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
b150: 70 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  pt = 0;.    for(
b160: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
b170: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
b180: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
b190: 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30   pPg->inCkpt = 0
b1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b1c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
b1d0: 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a  k a checkpoint..
b1e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
b1f0: 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b  er_ckpt_rollback
b200: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b210: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
b220: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
b230: 73 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  se ){.    rc = p
b240: 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61  ager_ckpt_playba
b250: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
b260: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
b270: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
b280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
b290: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b2a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b2b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  ..#if SQLITE_TES
b2c0: 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  T./*.** Print a 
b2d0: 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
b2e0: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
b2f0: 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
b300: 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
b310: 69 74 65 70 61 67 65 72 5f 72 65 66 64 75 6d 70  itepager_refdump
b320: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b330: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
b340: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b350: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b360: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
b370: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
b380: 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
b390: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47  .    printf("PAG
b3a0: 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38  E %3d addr=0x%08
b3b0: 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  x nRef=%d\n", . 
b3c0: 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
b3d0: 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
b3e0: 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
b3f0: 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
b400: 69 66 0a                                         if.