/ Hex Artifact Content
Login

Artifact e1419353e68c45aaae2555d2000f72de6525faac:


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 33  : pager.c,v 1.43
0350: 20 32 30 30 32 2f 30 33 2f 30 35 20 31 32 3a 34   2002/03/05 12:4
0360: 31 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  1:20 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 69 6e  ges */.  char in
0ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
0cc0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
0cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
0ce0: 2f 0a 20 20 63 68 61 72 20 69 6e 43 6b 70 74 3b  /.  char inCkpt;
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 72     /* TRUE if wr
0d10: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 68 65  itten to the che
0d20: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
0d30: 2a 2f 0a 20 20 63 68 61 72 20 64 69 72 74 79 3b  */.  char dirty;
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
0d60: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
0d70: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
0d80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45    /* SQLITE_PAGE
0d90: 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70  _SIZE bytes of p
0da0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
0db0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
0dc0: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
0dd0: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
0de0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
0df0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
0e00: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0e10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
0e20: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
0e30: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
0e40: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
0e50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
0e60: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
0e70: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
0e80: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
0e90: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
0ea0: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
0eb0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
0ec0: 4f 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69  O_EXTRA(P) ((voi
0ed0: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  d*)&((char*)(&(P
0ee0: 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41  )[1]))[SQLITE_PA
0ef0: 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a  GE_SIZE])../*.**
0f00: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
0f10: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
0f20: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
0f30: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
0f40: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
0f50: 62 65 72 2e 20 20 4b 6e 75 74 68 20 73 61 79 73  ber.  Knuth says
0f60: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   this should be 
0f70: 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a  a prime number..
0f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f  */.#define N_PG_
0f90: 48 41 53 48 20 32 30 30 33 0a 0a 2f 2a 0a 2a 2a  HASH 2003../*.**
0fa0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
0fb0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
0fc0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0fd0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
0fe0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
0ff0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1000: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1010: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1020: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1030: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
1040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1050: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1060: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  al file */.  OsF
1070: 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20  ile fd, jfd;    
1080: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1090: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
10a0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
10b0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
10c0: 65 20 63 70 66 64 3b 20 20 20 20 20 20 20 20 20  e cpfd;         
10d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
10e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
10f0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
1100: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rnal */.  int db
1110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1130: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1140: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
1150: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
1160: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
1170: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1180: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
1190: 6e 74 20 63 6b 70 74 53 69 7a 65 2c 20 63 6b 70  nt ckptSize, ckp
11a0: 74 4a 53 69 7a 65 3b 20 20 20 20 2f 2a 20 53 69  tJSize;    /* Si
11b0: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 61  ze of database a
11c0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b  nd journal at ck
11d0: 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  pt_begin() */.  
11e0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1200: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
1210: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
1220: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
1230: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1240: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1250: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1260: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1270: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1280: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1290: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
12a0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
12b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
12c0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
12d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12e0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
12f0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
1300: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
1310: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
1320: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1330: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1340: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1350: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1360: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1370: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1380: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1390: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
13a0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
13b0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
13c0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
13d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
13e0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
13f0: 20 20 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20    u8 ckptOpen;  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1410: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 68 65   True if the che
1420: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1430: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
1440: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
1450: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
1460: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
1470: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
1480: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
14b0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
14c0: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
14d0: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
14e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
14f0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1500: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1510: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1530: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1540: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1550: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1570: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1580: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1590: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
15c0: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
15d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
15e0: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
15f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1600: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
1610: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
1620: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1630: 20 20 75 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20    u8 *aInCkpt;  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1650: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
1660: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
1670: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64  tabase */.  PgHd
1680: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
1690: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
16a0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
16b0: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
16e0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
16f0: 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d  aHash[N_PG_HASH]
1700: 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ;    /* Hash tab
1710: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
1720: 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a  umber of PgHdr *
1730: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
1740: 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20  e are bits that 
1750: 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61  can be set in Pa
1760: 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a  ger.errMask..*/.
1770: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1780: 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20  R_FULL     0x01 
1790: 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61   /* a write() fa
17a0: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
17b0: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20  PAGER_ERR_MEM   
17c0: 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c     0x02  /* mall
17d0: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  oc() failed */.#
17e0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
17f0: 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20  _LOCK     0x04  
1800: 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  /* error in the 
1810: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1820: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1830: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30  R_ERR_CORRUPT  0
1840: 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65  x08  /* database
1850: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   or journal corr
1860: 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  uption */.#defin
1870: 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  e PAGER_ERR_DISK
1880: 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65       0x10  /* ge
1890: 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65  neral disk I/O e
18a0: 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20  rror - bad hard 
18b0: 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  drive? */../*.**
18c0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
18d0: 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20  e contains page 
18e0: 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66  records in the f
18f0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d  ollowing.** form
1900: 61 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  at..*/.typedef s
1910: 74 72 75 63 74 20 50 61 67 65 52 65 63 6f 72 64  truct PageRecord
1920: 20 50 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72   PageRecord;.str
1930: 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b  uct PageRecord {
1940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
1970: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61  mber */.  char a
1980: 44 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45  Data[SQLITE_PAGE
1990: 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67  _SIZE];  /* Orig
19a0: 69 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61  inal data for pa
19b0: 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  ge pgno */.};../
19c0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
19d0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
19e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
19f0: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
1a00: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
1a10: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
1a20: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
1a30: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
1a40: 74 79 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  ty check..*/.sta
1a50: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1a60: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
1a70: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
1a80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
1a90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
1aa0: 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b  , 0x63, 0xd4,.};
1ab0: 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70  ../*.** Hash a p
1ac0: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64  age number.*/.#d
1ad0: 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68  efine pager_hash
1ae0: 28 50 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50 47  (PN)  ((PN)%N_PG
1af0: 5f 48 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e  _HASH)../*.** En
1b00: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
1b10: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65  ount tracking he
1b20: 72 65 3a 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  re:.*/.#if SQLIT
1b30: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
1b40: 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  er_refinfo_enabl
1b50: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
1b60: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
1b70: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
1b80: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
1b90: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
1ba0: 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ager_refinfo_ena
1bb0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
1bc0: 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
1bd0: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
1be0: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
1bf0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
1c00: 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
1c10: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
1c20: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
1c30: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
1c40: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
1c50: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
1c60: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
1c70: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
1c80: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
1c90: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
1ca0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
1cb0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69  * Convert the bi
1cc0: 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65 72  ts in the pPager
1cd0: 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61  ->errMask into a
1ce0: 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20  n approprate.** 
1cf0: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a  return code..*/.
1d00: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d10: 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a  _errcode(Pager *
1d20: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d50: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
1d60: 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20  _LOCK )    rc = 
1d70: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
1d80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d90: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
1da0: 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20  RR_DISK )    rc 
1db0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
1dc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1dd0: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
1de0: 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d  R_FULL )    rc =
1df0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1e00: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
1e10: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
1e20: 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53  MEM )     rc = S
1e30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69  QLITE_NOMEM;.  i
1e40: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
1e50: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43  sk & PAGER_ERR_C
1e60: 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53 51  ORRUPT ) rc = SQ
1e70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1e80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e90: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
1ea0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
1eb0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
1ec0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
1ed0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
1ee0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
1ef0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1f00: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
1f10: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
1f20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f30: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1f40: 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48   *p = pPager->aH
1f50: 61 73 68 5b 70 67 6e 6f 20 25 20 4e 5f 50 47 5f  ash[pgno % N_PG_
1f60: 48 41 53 48 5d 3b 0a 20 20 77 68 69 6c 65 28 20  HASH];.  while( 
1f70: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
1f80: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
1f90: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
1fa0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1fb0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
1fc0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
1fd0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
1fe0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
1ff0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
2000: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
2010: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
2020: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
2030: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
2040: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
2050: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
2060: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
2070: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
2080: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
2090: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
20a0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
20b0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
20c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
20d0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
20e0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
20f0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
2100: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
2110: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
2120: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
2130: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
2140: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
2150: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
2160: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2170: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
2180: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
2190: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d  r->pAll = 0;.  m
21a0: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
21b0: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
21c0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a  Pager->aHash));.
21d0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
21e0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
21f0: 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45  r->state>=SQLITE
2200: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20  _WRITELOCK ){.  
2210: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
2220: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
2230: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e    }.  sqliteOsUn
2240: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
2250: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
2260: 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  te = SQLITE_UNLO
2270: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  CK;.  pPager->db
2280: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
2290: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
22a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
22c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  );.}../*.** When
22d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22e0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
22f0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
2300: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
2310: 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  .** a write lock
2320: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2330: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2340: 72 65 6c 65 61 73 65 73 20 74 68 65 20 64 61 74  releases the dat
2350: 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c  abase.** write l
2360: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
2370: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20   a read lock in 
2380: 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20  its place.  The 
2390: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
23a0: 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63  is deleted and c
23b0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
23c0: 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69   int pager_unwri
23d0: 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  telock(Pager *pP
23e0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
23f0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
2400: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2410: 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  te<SQLITE_WRITEL
2420: 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  OCK ) return SQL
2430: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
2440: 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69  pager_ckpt_commi
2450: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  t(pPager);.  sql
2460: 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  iteOsClose(&pPag
2470: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67  er->jfd);.  pPag
2480: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
2490: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 4f 73 44  = 0;.  sqliteOsD
24a0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
24b0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20  ournal);.  rc = 
24c0: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
24d0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
24e0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
24f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
2500: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
2510: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
2520: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2530: 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 50  al = 0;.  for(pP
2540: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
2550: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
2560: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 70 50 67  extAll){.    pPg
2570: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
2580: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
2590: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
25a0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
25b0: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 72 65  E_READLOCK;.  re
25c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25d0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
25e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
25f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
2600: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
2610: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
2620: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
2630: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2640: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
2650: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
2660: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
2670: 65 20 2a 6a 66 64 29 7b 0a 20 20 69 6e 74 20 72  e *jfd){.  int r
2680: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
26b0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
26c0: 2f 0a 20 20 50 61 67 65 52 65 63 6f 72 64 20 70  /.  PageRecord p
26d0: 67 52 65 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  gRec;..  rc = sq
26e0: 6c 69 74 65 4f 73 52 65 61 64 28 6a 66 64 2c 20  liteOsRead(jfd, 
26f0: 26 70 67 52 65 63 2c 20 73 69 7a 65 6f 66 28 70  &pgRec, sizeof(p
2700: 67 52 65 63 29 29 3b 0a 20 20 69 66 28 20 72 63  gRec));.  if( rc
2710: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2720: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53  turn rc;..  /* S
2730: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
2740: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
2750: 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e 70  if( pgRec.pgno>p
2760: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
2770: 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20 29   pgRec.pgno==0 )
2780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2790: 4f 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20 50 6c  ORRUPT;..  /* Pl
27a0: 61 79 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e  ayback the page.
27b0: 20 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d    Update the in-
27c0: 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74  memory copy of t
27d0: 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74 20  he page.  ** at 
27e0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69  the same time, i
27f0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
2800: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
2810: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2820: 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20  , pgRec.pgno);. 
2830: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
2840: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
2850: 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65 63  DATA(pPg), pgRec
2860: 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50  .aData, SQLITE_P
2870: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  AGE_SIZE);.    m
2880: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
2890: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
28a0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
28b0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
28c0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
28d0: 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f 2d  fd, (pgRec.pgno-
28e0: 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  1)*SQLITE_PAGE_S
28f0: 49 5a 45 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  IZE);.  if( rc==
2900: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2910: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
2920: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
2930: 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51   pgRec.aData, SQ
2940: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
2950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
2970: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
2980: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
2990: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29a0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
29b0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
29c0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
29d0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
29e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
29f0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
2a00: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 54  s as follows:  T
2a10: 68 65 72 65 20 69 73 20 61 6e 20 69 6e 69 74 69  here is an initi
2a20: 61 6c 0a 2a 2a 20 66 69 6c 65 2d 74 79 70 65 20  al.** file-type 
2a30: 73 74 72 69 6e 67 20 66 6f 72 20 73 61 6e 69 74  string for sanit
2a40: 79 20 63 68 65 63 6b 69 6e 67 2e 20 20 54 68 65  y checking.  The
2a50: 6e 20 74 68 65 72 65 20 69 73 20 61 20 73 69 6e  n there is a sin
2a60: 67 6c 65 0a 2a 2a 20 50 67 6e 6f 20 6e 75 6d 62  gle.** Pgno numb
2a70: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
2a80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2a90: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2aa0: 62 65 66 6f 72 65 0a 2a 2a 20 63 68 61 6e 67 65  before.** change
2ab0: 73 20 77 65 72 65 20 6d 61 64 65 2e 20 20 54 68  s were made.  Th
2ac0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 72  e database is tr
2ad0: 75 6e 63 61 74 65 64 20 74 6f 20 74 68 69 73 20  uncated to this 
2ae0: 73 69 7a 65 2e 0a 2a 2a 20 4e 65 78 74 20 63 6f  size..** Next co
2af0: 6d 65 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  me zero or more 
2b00: 70 61 67 65 20 72 65 63 6f 72 64 73 20 77 68 65  page records whe
2b10: 72 65 20 65 61 63 68 20 70 61 67 65 20 72 65 63  re each page rec
2b20: 6f 72 64 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20  ord.** consists 
2b30: 6f 66 20 61 20 50 67 6e 6f 20 61 6e 64 20 53 51  of a Pgno and SQ
2b40: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
2b50: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 20 53  ytes of data.  S
2b60: 65 65 0a 2a 2a 20 74 68 65 20 50 61 67 65 52 65  ee.** the PageRe
2b70: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 66  cord structure f
2b80: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  or details..**.*
2b90: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
2ba0: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
2bb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2bc0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
2bd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 61   journal file (a
2be0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
2bf0: 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 6d  looking at the m
2c00: 61 67 69 63 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  agic number.** a
2c10: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 29  t the beginning)
2c20: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2c30: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2c40: 45 5f 50 52 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49  E_PROTOCOL..** I
2c50: 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f  f any other erro
2c60: 72 73 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20  rs occur during 
2c70: 70 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 64 61  playback, the da
2c80: 74 61 62 61 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c  tabase will.** l
2c90: 69 6b 65 6c 79 20 62 65 20 63 6f 72 72 75 70 74  ikely be corrupt
2ca0: 65 64 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52  ed, so the PAGER
2cb0: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74  _ERR_CORRUPT bit
2cc0: 20 69 73 20 73 65 74 20 69 6e 0a 2a 2a 20 70 50   is set in.** pP
2cd0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 61 6e  ager->errMask an
2ce0: 64 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  d SQLITE_CORRUPT
2cf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
2d00: 66 20 69 74 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b  f it all.** work
2d10: 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
2d20: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2d30: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
2d40: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
2d50: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
2d60: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  er){.  int nRec;
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
2d90: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2dc0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
2dd0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
2de0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2df0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
2e00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69   pages */.  unsi
2e10: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
2e20: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
2e30: 4d 61 67 69 63 29 5d 3b 0a 20 20 69 6e 74 20 72  Magic)];.  int r
2e40: 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  c;..  /* Figure 
2e50: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
2e60: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
2e70: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
2e80: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
2e90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
2ea0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
2eb0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2ec0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
2ed0: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
2ee0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20  ->jfd, 0);.  rc 
2ef0: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
2f00: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
2f10: 20 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   &nRec);.  if( r
2f20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
2f40: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
2f50: 63 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a  c = (nRec - (siz
2f60: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
2f70: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
2f80: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
2f90: 0a 20 20 69 66 28 20 6e 52 65 63 3c 3d 30 20 29  .  if( nRec<=0 )
2fa0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
2fb0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
2fc0: 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69  /* Read the begi
2fd0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  nning of the jou
2fe0: 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74  rnal and truncat
2ff0: 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  e the.  ** datab
3000: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
3010: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
3020: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
3030: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
3040: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
3050: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
3060: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
3070: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
3080: 70 28 61 4d 61 67 69 63 2c 61 4a 6f 75 72 6e 61  p(aMagic,aJourna
3090: 6c 4d 61 67 69 63 2c 73 69 7a 65 6f 66 28 61 4d  lMagic,sizeof(aM
30a0: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
30b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
30c0: 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20  TOCOL;.    goto 
30d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
30e0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
30f0: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a  sRead(&pPager->j
3100: 66 64 2c 20 26 6d 78 50 67 2c 20 73 69 7a 65 6f  fd, &mxPg, sizeo
3110: 66 28 6d 78 50 67 29 29 3b 0a 20 20 69 66 28 20  f(mxPg));.  if( 
3120: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3130: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
3140: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  ayback;.  }.  rc
3150: 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63   = sqliteOsTrunc
3160: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
3170: 20 6d 78 50 67 2a 53 51 4c 49 54 45 5f 50 41 47   mxPg*SQLITE_PAG
3180: 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72  E_SIZE);.  if( r
3190: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
31b0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
31c0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
31d0: 50 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  Pg;.  .  /* Copy
31e0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
31f0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
3200: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
3210: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3220: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
3230: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
3240: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
3250: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
3260: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
3270: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
3280: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3290: 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  OK ) break;.  }.
32a0: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
32b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32c0: 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
32d0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
32e0: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
32f0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
3300: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
3310: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
3320: 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
3330: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
3340: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
3350: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
3360: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3370: 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68 65 63  layback the chec
3380: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
3390: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
33a0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
33b0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
33c0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
33d0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
33e0: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
33f0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
3400: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
3410: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3420: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
3430: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
3440: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
3450: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
3460: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e 6f  er->ckptSize, no
3470: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
3480: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
3490: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
34a0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
34b0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
34c0: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
34d0: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
34e0: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
34f0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
3500: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3510: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
3520: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
3530: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
3540: 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  ckptJSize..*/.st
3550: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 63  atic int pager_c
3560: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  kpt_playback(Pag
3570: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3580: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
3590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35a0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
35b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
35c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
35d0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
35e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72  int rc;..  /* Tr
35f0: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
3600: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
3610: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
3620: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
3630: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
3640: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
3650: 3e 63 6b 70 74 53 69 7a 65 2a 53 51 4c 49 54 45  >ckptSize*SQLITE
3660: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 70  _PAGE_SIZE);.  p
3670: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
3680: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
3690: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
36a0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
36b0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  rds are in the c
36c0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
36d0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
36e0: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70  ( pPager->ckptOp
36f0: 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
3700: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
3710: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
3720: 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20  ger->cpfd, 0);. 
3730: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
3740: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
3750: 63 70 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20  cpfd, &nRec);.  
3760: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3770: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
3780: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
3790: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 2f 3d 20 73  .  }.  nRec /= s
37a0: 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64  izeof(PageRecord
37b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  );.  .  /* Copy 
37c0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
37d0: 75 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  ut of the checkp
37e0: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  oint journal and
37f0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
3800: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
3810: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
3820: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
3830: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
3840: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
3850: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
3860: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
3870: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3880: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  OK ) goto end_ck
3890: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
38a0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
38b0: 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73  t how many pages
38c0: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70 69   need to be copi
38d0: 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 72  ed out of the tr
38e0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a  ansaction.  ** j
38f0: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72  ournal..  */.  r
3900: 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  c = sqliteOsSeek
3910: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
3920: 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65  Pager->ckptJSize
3930: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3940: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
3950: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
3960: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  back;.  }.  rc =
3970: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
3980: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
3990: 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  &nRec);.  if( rc
39a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
39b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
39c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
39d0: 20 6e 52 65 63 20 3d 20 28 6e 52 65 63 20 2d 20   nRec = (nRec - 
39e0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
39f0: 65 29 2f 73 69 7a 65 6f 66 28 50 61 67 65 52 65  e)/sizeof(PageRe
3a00: 63 6f 72 64 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  cord);.  for(i=n
3a10: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
3a20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
3a30: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
3a40: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
3a50: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 69  ger->jfd);.    i
3a60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3a70: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74   ) goto end_ckpt
3a80: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
3a90: 20 0a 0a 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79   ..end_ckpt_play
3aa0: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d  back:.  if( rc!=
3ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3ac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3ad0: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
3ae0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
3af0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
3b00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3b20: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3b30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
3b40: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
3b50: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
3b60: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74   sqlitepager_set
3b70: 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  _cachesize(Pager
3b80: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
3b90: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
3ba0: 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  age>=0 ){.    pP
3bb0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 30  ager->noSync = 0
3bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3bd0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
3be0: 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20  1;.    mxPage = 
3bf0: 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  -mxPage;.  }.  i
3c00: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
3c10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
3c20: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
3c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
3c40: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
3c50: 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65    Write the name
3c60: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
3c70: 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d  o zName.** (zNam
3c80: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
3c90: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
3ca0: 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f  ME_SIZE bytes lo
3cb0: 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74  ng.)  Write.** t
3cc0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
3cd0: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
3ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
3cf0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
3d00: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
3d10: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
3d20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77  ..**.** The OS w
3d30: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
3d40: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
3d50: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
3d60: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64   it is.** closed
3d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3d80: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
3d90: 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65  temp(char *zFile
3da0: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20  , OsFile *fd){. 
3db0: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
3dc0: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20  int rc;.  do{.  
3dd0: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
3de0: 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  iteOsTempFileNam
3df0: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
3e00: 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45   = sqliteOsOpenE
3e10: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
3e20: 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  fd, 1);.  }while
3e30: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
3e40: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
3e50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3e60: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
3e70: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
3e80: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
3e90: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
3ea0: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
3eb0: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
3ec0: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
3ed0: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
3ee0: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
3ef0: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
3f00: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67  all to sqlitepag
3f10: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
3f20: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
3f30: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
3f40: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
3f50: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61  d using sqlitepa
3f60: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a  ger_unref()..**.
3f70: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
3f80: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
3f90: 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
3fa0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
3fb0: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
3fc0: 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
3fd0: 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
3fe0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
3ff0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
4000: 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
4010: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
4020: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f  nt sqlitepager_o
4030: 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70  pen(.  Pager **p
4040: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
4050: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
4060: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
4070: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
4080: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
4090: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
40a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
40b0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d   open */.  int m
40c0: 78 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  xPage,          
40d0: 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65      /* Max numbe
40e0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63  r of in-memory c
40f0: 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  ache pages */.  
4100: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4110: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
4120: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
4130: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
4140: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 50 61   page */.){.  Pa
4150: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
4160: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73  nt nameLen;.  Os
4170: 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72  File fd;.  int r
4180: 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  c;.  int tempFil
4190: 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  e;.  int readOnl
41a0: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
41b0: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
41c0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
41d0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66  pPager = 0;.  if
41e0: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
41f0: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
4200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4210: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
4220: 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 72 63  lename ){.    rc
4230: 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52   = sqliteOsOpenR
4240: 65 61 64 57 72 69 74 65 28 7a 46 69 6c 65 6e 61  eadWrite(zFilena
4250: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
4260: 6c 79 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c  ly);.    tempFil
4270: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
4280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
4290: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
42a0: 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a  emp, &fd);.    z
42b0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
42c0: 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  ;.    tempFile =
42d0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   1;.  }.  if( rc
42e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
42f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4300: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
4310: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
4320: 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  n(zFilename);.  
4330: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
4340: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
4350: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
4360: 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28  *2 + 30 );.  if(
4370: 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20   pPager==0 ){.  
4380: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
4390: 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  &fd);.    return
43a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
43b0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69   }.  pPager->zFi
43c0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
43d0: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
43e0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
43f0: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
4400: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
4410: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
4420: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c  >zFilename, zFil
4430: 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  ename);.  strcpy
4440: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
4450: 6c 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  l, zFilename);. 
4460: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
4470: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
4480: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
4490: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
44a0: 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  fd;.  pPager->jo
44b0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
44c0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
44d0: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
44e0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61  >nRef = 0;.  pPa
44f0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
4500: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
4510: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
4520: 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20  er->ckptJSize = 
4530: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  0;.  pPager->nPa
4540: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
4550: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
4560: 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31  e>5 ? mxPage : 1
4570: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
4580: 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  te = SQLITE_UNLO
4590: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
45a0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
45b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
45c0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
45d0: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
45e0: 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65  eadOnly;.  pPage
45f0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
4600: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
4610: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
4620: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
4630: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e  ager->nExtra = n
4640: 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74 28  Extra;.  memset(
4650: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
4660: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
4670: 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50  >aHash));.  *ppP
4680: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
4690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
46a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
46b0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
46c0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
46d0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
46e0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
46f0: 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
4700: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4710: 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
4720: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
4730: 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
4740: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
4750: 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
4760: 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
4770: 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
4780: 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
4790: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
47a0: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
47b0: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
47c0: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
47d0: 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
47e0: 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
47f0: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70 61  lled by sqlitepa
4800: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
4810: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
4820: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
4830: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
4840: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
4850: 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  d*)){.  pPager->
4860: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
4870: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  esc;.}../*.** Re
4880: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
4890: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
48a0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
48b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
48c0: 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e  ** pPager..*/.in
48d0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61  t sqlitepager_pa
48e0: 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
48f0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 3b  Pager){.  int n;
4900: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4910: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
4920: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
4930: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
4940: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
4950: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73  }.  if( sqliteOs
4960: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
4970: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
4980: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
4990: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
49a0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20  AGER_ERR_DISK;. 
49b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
49c0: 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50  .  n /= SQLITE_P
49d0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20  AGE_SIZE;.  if( 
49e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
49f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  QLITE_UNLOCK ){.
4a00: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
4a10: 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ze = n;.  }.  re
4a20: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
4a30: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
4a40: 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
4a50: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
4a60: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
4a70: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
4a80: 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
4a90: 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
4aa0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4ab0: 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
4ac0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
4ad0: 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
4ae0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
4af0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
4b00: 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
4b10: 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
4b20: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
4b30: 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
4b40: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
4b50: 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
4b60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
4b70: 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
4b80: 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
4b90: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69  a coredump..*/.i
4ba0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
4bb0: 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
4bc0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
4bd0: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69  g, *pNext;.  swi
4be0: 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
4bf0: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  te ){.    case S
4c00: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a  QLITE_WRITELOCK:
4c10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70   {.      sqlitep
4c20: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
4c30: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
4c40: 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  iteOsUnlock(&pPa
4c50: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
4c60: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4c70: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
4c80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4ca0: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b  LITE_READLOCK: {
4cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55  .      sqliteOsU
4cc0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
4cd0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
4cf0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
4d00: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
4d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d20: 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
4d30: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4d40: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
4d50: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
4d60: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
4d70: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
4d80: 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65  .  sqliteOsClose
4d90: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
4da0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4db0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
4dc0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
4dd0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
4de0: 20 2f 2a 20 73 71 6c 69 74 65 4f 73 44 65 6c 65   /* sqliteOsDele
4df0: 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
4e00: 6e 61 6d 65 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  name); */.  }.  
4e10: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
4e20: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
4e30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4e40: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
4e50: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
4e60: 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
4e70: 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70  .*/.Pgno sqlitep
4e80: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
4e90: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
4ea0: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
4eb0: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
4ec0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
4ed0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  o;.}../*.** Incr
4ee0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4ef0: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
4f00: 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
4f10: 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ge is.** current
4f20: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
4f30: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
4f40: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
4f50: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
4f60: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
4f70: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
4f80: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
4f90: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
4fa0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
4fb0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
4fc0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
4fd0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
4fe0: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
4ff0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
5000: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
5010: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
5020: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
5030: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
5040: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
5050: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
5060: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
5070: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5080: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
5090: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
50a0: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
50b0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
50c0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
50d0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
50e0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
50f0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
5100: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
5110: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
5120: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
5130: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  INFO(pPg);.}../*
5140: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
5150: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
5160: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
5170: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
5180: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
5190: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
51a0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
51b0: 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  tepager_ref(void
51c0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
51d0: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
51e0: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
51f0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
5200: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5210: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
5220: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
5230: 64 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c  d then write all
5240: 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65   free dirty page
5250: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
5260: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  e.** file..**.**
5270: 20 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65   Writing all fre
5280: 65 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  e dirty pages to
5290: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66   the database af
52a0: 74 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20  ter the sync is 
52b0: 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73  a.** non-obvious
52c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
52d0: 66 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78  fsync() is an ex
52e0: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
52f0: 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20  n so we.** want 
5300: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
5310: 6e 75 6d 62 65 72 20 6f 74 20 74 69 6d 65 73 20  number ot times 
5320: 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 66  it is called. Af
5330: 74 65 72 20 61 6e 20 66 73 79 6e 63 28 29 20 63  ter an fsync() c
5340: 61 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66  all,.** we are f
5350: 72 65 65 20 74 6f 20 77 72 69 74 65 20 64 69 72  ree to write dir
5360: 74 79 20 70 61 67 65 73 20 62 61 63 6b 20 74 6f  ty pages back to
5370: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
5380: 49 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f  It is best.** to
5390: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 77 72   go ahead and wr
53a0: 69 74 65 20 61 73 20 6d 61 6e 79 20 64 69 72 74  ite as many dirt
53b0: 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
53c0: 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ble to minimize 
53d0: 0a 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f 66 20  .** the risk of 
53e0: 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f  having to do ano
53f0: 74 68 65 72 20 66 73 79 6e 63 28 29 20 6c 61 74  ther fsync() lat
5400: 65 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20  er on.  Writing 
5410: 64 69 72 74 79 0a 2a 2a 20 66 72 65 65 20 70 61  dirty.** free pa
5420: 67 65 73 20 69 6e 20 74 68 69 73 20 77 61 79 20  ges in this way 
5430: 77 61 73 20 6f 62 73 65 72 76 65 64 20 74 6f 20  was observed to 
5440: 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 6f 70  make database op
5450: 65 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75  erations go.** u
5460: 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66 61  p to 10 times fa
5470: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  ster..**.** If w
5480: 65 20 61 72 65 20 77 72 69 74 69 6e 67 20 74 6f  e are writing to
5490: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
54a0: 61 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ase, there is no
54b0: 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76   need to preserv
54c0: 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 72 69  e.** the integri
54d0: 74 79 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ty of the journa
54e0: 6c 20 66 69 6c 65 2c 20 73 6f 20 77 65 20 63 61  l file, so we ca
54f0: 6e 20 73 61 76 65 20 74 69 6d 65 20 61 6e 64 20  n save time and 
5500: 73 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e  skip the.** fsyn
5510: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  c()..*/.static i
5520: 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28  nt syncAllPages(
5530: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5540: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
5550: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5560: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
5570: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
5580: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
5590: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
55a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79   rc = sqliteOsSy
55b0: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
55c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
55d0: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
55e0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
55f0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
5600: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
5610: 67 65 72 2d 3e 70 46 69 72 73 74 3b 20 70 50 67  ger->pFirst; pPg
5620: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
5630: 46 72 65 65 29 7b 0a 20 20 20 20 69 66 28 20 70  Free){.    if( p
5640: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
5650: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
5660: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 50  &pPager->fd, (pP
5670: 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54  g->pgno-1)*SQLIT
5680: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
5690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
56a0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
56b0: 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
56c0: 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50  A(pPg), SQLITE_P
56d0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
56e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
56f0: 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
5700: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
5710: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5720: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5730: 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
5740: 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
5750: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
5760: 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
5770: 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
5780: 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
5790: 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
57a0: 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
57b0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
57c0: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
57d0: 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72  **.** A _get wor
57e0: 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
57f0: 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
5800: 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
5810: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
5820: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5830: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
5840: 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
5850: 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
5860: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
5870: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
5880: 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
5890: 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
58a0: 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
58b0: 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
58c0: 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
58d0: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
58e0: 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
58f0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
5900: 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
5910: 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
5920: 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
5930: 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
5940: 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
5950: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
5960: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
5970: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
5980: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
5990: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
59a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
59b0: 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c  so sqlitepager_l
59c0: 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
59d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
59e0: 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
59f0: 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
5a00: 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
5a10: 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
5a20: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
5a30: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
5a40: 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
5a50: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
5a60: 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
5a70: 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
5a80: 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
5a90: 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
5aa0: 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
5ab0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
5ac0: 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
5ad0: 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
5ae0: 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
5af0: 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
5b00: 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
5b10: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
5b20: 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
5b30: 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
5b40: 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
5b50: 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
5b60: 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
5b70: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
5b80: 74 65 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  tepager_get(Page
5b90: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
5ba0: 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
5bb0: 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
5bc0: 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  Pg;..  /* Make s
5bd0: 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
5be0: 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
5bf0: 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
5c00: 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 7c   if( pPager==0 |
5c10: 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  | pgno==0 ){.   
5c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
5c30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5c40: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
5c50: 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
5c60: 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
5c70: 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
5c80: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
5c90: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5ca0: 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
5cb0: 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
5cc0: 61 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a  a read lock.  **
5cd0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
5ce0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
5cf0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
5d00: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
5d10: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
5d20: 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
5d30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
5d40: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
5d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5d60: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
5d70: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
5d80: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
5d90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
5da0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
5db0: 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20 69  s, try to play i
5dc0: 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  t back..    */. 
5dd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46     if( sqliteOsF
5de0: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
5df0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  ->zJournal) ){. 
5e00: 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20 64 75        int rc, du
5e10: 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  mmy;..       /* 
5e20: 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  Get a write lock
5e30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
5e40: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
5e50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
5e60: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
5e70: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  ->fd);.       if
5e80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5e90: 29 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20 3d  ){.         rc =
5ea0: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
5eb0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
5ec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
5ed0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5ee0: 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
5ef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72   = 0;.         r
5f00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5f10: 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  Y;.       }.    
5f20: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
5f30: 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c   = SQLITE_WRITEL
5f40: 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  OCK;..       /* 
5f50: 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
5f60: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
5f70: 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 53  ccess.  Return S
5f80: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
5f90: 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f       ** we canno
5fa0: 74 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 20  t get exclusive 
5fb0: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6a 6f  access to the jo
5fc0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
5fd0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
5fe0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20   Even though we 
5ff0: 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61  will only be rea
6000: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
6010: 75 72 6e 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69  urnal, not writi
6020: 6e 67 2c 0a 20 20 20 20 20 20 20 2a 2a 20 77 65  ng,.       ** we
6030: 20 68 61 76 65 20 74 6f 20 6f 70 65 6e 20 74 68   have to open th
6040: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72  e journal for wr
6050: 69 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  iting in order t
6060: 6f 20 6f 62 74 61 69 6e 20 61 6e 0a 20 20 20 20  o obtain an.    
6070: 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
6080: 61 63 63 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20  access lock..   
6090: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
60a0: 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52   = sqliteOsOpenR
60b0: 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72 2d  eadWrite(pPager-
60c0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
60d0: 65 72 2d 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29  er->jfd, &dummy)
60e0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
60f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6100: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6110: 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  teOsUnlock(&pPag
6120: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
6130: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
6140: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
6150: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
6160: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
6170: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
6190: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
61a0: 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 2f  n = 1;..       /
61b0: 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
61c0: 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
61d0: 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
61e0: 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
61f0: 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
6200: 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
6210: 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
6220: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
6230: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
6240: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
6250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6260: 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
6270: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
6280: 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30     }.    pPg = 0
6290: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
62a0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67  * Search for pag
62b0: 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  e in cache */.  
62c0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
62d0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
62e0: 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  o);.  }.  if( pP
62f0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
6300: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
6310: 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
6320: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
6330: 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
6340: 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
6350: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
6360: 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
6370: 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
6380: 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
6390: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
63a0: 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
63b0: 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
63c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  oc( sizeof(*pPg)
63d0: 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   + SQLITE_PAGE_S
63e0: 49 5a 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  IZE + pPager->nE
63f0: 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66  xtra );.      if
6400: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
6410: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
6420: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75  .        pager_u
6430: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
6440: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
6450: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
6460: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
6470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6490: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
64a0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
64b0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
64c0: 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
64d0: 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  l;.      if( pPa
64e0: 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
64f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
6500: 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50  l->pPrevAll = pP
6510: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
6520: 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d   pPg->pPrevAll =
6530: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
6540: 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
6550: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
6560: 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
6570: 20 20 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65        /* Recycle
6580: 20 61 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e 20   an older page. 
6590: 20 46 69 72 73 74 20 6c 6f 63 61 74 65 20 74 68   First locate th
65a0: 65 20 70 61 67 65 20 74 6f 20 62 65 20 72 65 63  e page to be rec
65b0: 79 63 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ycled..      ** 
65c0: 54 72 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20  Try to find one 
65d0: 74 68 61 74 20 69 73 20 6e 6f 74 20 64 69 72 74  that is not dirt
65e0: 79 20 61 6e 64 20 69 73 20 6e 65 61 72 20 74 68  y and is near th
65f0: 65 20 68 65 61 64 20 6f 66 0a 20 20 20 20 20 20  e head of.      
6600: 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 20 6c  ** of the free l
6610: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  ist */.      pPg
6620: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
6630: 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
6640: 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
6650: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  y ){.        pPg
6660: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
6670: 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
6680: 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
6690: 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
66a0: 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65   that has not be
66b0: 65 6e 20 75 73 65 64 20 72 65 63 65 6e 74 6c 79  en used recently
66c0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 68  .      ** and wh
66d0: 69 63 68 20 69 73 20 6e 6f 74 20 64 69 72 74 79  ich is not dirty
66e0: 2c 20 74 68 65 6e 20 73 79 6e 63 20 74 68 65 20  , then sync the 
66f0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 72 69 74  journal and writ
6700: 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 64  e all.      ** d
6710: 69 72 74 79 20 66 72 65 65 20 70 61 67 65 73 20  irty free pages 
6720: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
6730: 65 20 66 69 6c 65 2c 20 74 68 75 73 20 6d 61 6b  e file, thus mak
6740: 69 6e 67 20 74 68 65 6d 0a 20 20 20 20 20 20 2a  ing them.      *
6750: 2a 20 63 6c 65 61 6e 20 70 61 67 65 73 20 61 6e  * clean pages an
6760: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
6770: 72 65 63 79 63 6c 69 6e 67 2e 0a 20 20 20 20 20  recycling..     
6780: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20   **.      ** We 
6790: 68 61 76 65 20 74 6f 20 73 79 6e 63 20 74 68 65  have to sync the
67a0: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
67b0: 77 72 69 74 69 6e 67 20 61 20 70 61 67 65 20 74  writing a page t
67c0: 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  o the main.     
67d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42   ** database.  B
67e0: 75 74 20 73 79 6e 63 69 6e 67 20 69 73 20 61 20  ut syncing is a 
67f0: 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
6800: 69 6f 6e 2e 20 20 53 6f 20 61 66 74 65 72 20 61  ion.  So after a
6810: 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2c 20  .      ** sync, 
6820: 69 74 20 69 73 20 62 65 73 74 20 74 6f 20 77 72  it is best to wr
6830: 69 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ite everything w
6840: 65 20 63 61 6e 20 62 61 63 6b 20 74 6f 20 74 68  e can back to th
6850: 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  e main.      ** 
6860: 64 61 74 61 62 61 73 65 20 74 6f 20 6d 69 6e 69  database to mini
6870: 6d 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f 66  mize the risk of
6880: 20 68 61 76 69 6e 67 20 74 6f 20 73 79 6e 63 20   having to sync 
6890: 61 67 61 69 6e 20 69 6e 20 74 68 65 0a 20 20 20  again in the.   
68a0: 20 20 20 2a 2a 20 6e 65 61 72 20 66 75 74 75 72     ** near futur
68b0: 65 2e 20 20 54 68 61 74 20 69 73 20 77 61 79 20  e.  That is way 
68c0: 77 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72  we write all dir
68d0: 74 79 20 70 61 67 65 73 20 61 66 74 65 72 20 61  ty pages after a
68e0: 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2e 0a  .      ** sync..
68f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
6900: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
6910: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
6920: 6e 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67 65  ncAllPages(pPage
6930: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
6940: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
6950: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
6960: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
6970: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
6980: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
6990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69a0: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
69b0: 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
69c0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
69d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
69e0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
69f0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
6a00: 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
6a10: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e   );..      /* Un
6a20: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
6a30: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
6a40: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
6a50: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
6a60: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
6a70: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
6a80: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
6a90: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
6aa0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
6ab0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
6ad0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
6ae0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
6af0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
6b00: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
6b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6b20: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
6b30: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
6b40: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
6b50: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
6b60: 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Free;.      }els
6b70: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
6b80: 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
6b90: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
6ba0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
6bb0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
6bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
6bd0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
6be0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
6bf0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
6c00: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
6c10: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65          pPg->pNe
6c20: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
6c30: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
6c40: 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sh;.      }.    
6c50: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6c60: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
6c70: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
6c80: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
6c90: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20  >pNextHash;.    
6ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6cb0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
6cc0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
6cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
6ce0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50  er->aHash[h]==pP
6cf0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
6d00: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
6d10: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
6d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
6d30: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
6d40: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
6d50: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
6d60: 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  >nOvfl++;.    }.
6d70: 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
6d80: 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
6d90: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
6da0: 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
6db0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
6dc0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
6dd0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
6de0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
6df0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
6e00: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
6e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
6e20: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
6e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e40: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20  pPager->aInCkpt 
6e50: 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
6e60: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29  ager->ckptSize )
6e70: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  {.      pPg->inC
6e80: 6b 70 74 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  kpt = (pPager->a
6e90: 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20 26  InCkpt[pgno/8] &
6ea0: 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
6eb0: 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  =0;.    }else{. 
6ec0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74       pPg->inCkpt
6ed0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6ee0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
6ef0: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
6f00: 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
6f10: 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
6f20: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
6f30: 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
6f40: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
6f50: 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
6f60: 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
6f70: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
6f80: 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
6f90: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
6fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
6fb0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
6fc0: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
6fd0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
6fe0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
6ff0: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
7000: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
7010: 65 3c 30 20 29 20 73 71 6c 69 74 65 70 61 67 65  e<0 ) sqlitepage
7020: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
7030: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
7040: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
7050: 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d  )pgno ){.      m
7060: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
7070: 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c  ATA(pPg), 0, SQL
7080: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
7090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70a0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 73   int rc;.      s
70b0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
70c0: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
70d0: 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  )*SQLITE_PAGE_SI
70e0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ZE);.      rc = 
70f0: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
7100: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
7110: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
7120: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
7130: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
7140: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7170: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
7180: 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
7190: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
71a0: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
71b0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
71c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
71d0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
71e0: 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
71f0: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
7200: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
7210: 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  t++;.    page_re
7220: 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
7230: 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
7240: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
7250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7260: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
7270: 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
7280: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
7290: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
72a0: 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
72b0: 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
72c0: 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
72d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
72e0: 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
72f0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
7300: 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
7310: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61  ee also sqlitepa
7320: 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20  ger_get().  The 
7330: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
7340: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7350: 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70 61 67  ** and sqlitepag
7360: 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
7370: 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
7380: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
7390: 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
73a0: 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
73b0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
73c0: 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
73d0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
73e0: 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
73f0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
7400: 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
7410: 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
7420: 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
7430: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
7440: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7450: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7460: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7470: 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  *pPg;..  /* Make
7480: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
7490: 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
74a0: 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
74b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
74c0: 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   || pgno==0 ){. 
74d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
74e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
74f0: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
7500: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
7510: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7520: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
7530: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ef==0 ){.    ret
7540: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
7550: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
7560: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
7570: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
7580: 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
7590: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
75a0: 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
75b0: 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
75c0: 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
75d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
75e0: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
75f0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
7600: 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
7610: 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
7620: 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
7630: 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
7640: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
7650: 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
7660: 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
7670: 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
7680: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
7690: 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
76a0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
76b0: 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
76c0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
76d0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
76e0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
76f0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7700: 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
7710: 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
7720: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
7730: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
7740: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
7750: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
7760: 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  FO(pPg);..  /* W
7770: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
7780: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
7790: 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
77a0: 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
77b0: 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
77c0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
77d0: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
77e0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
77f0: 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
7800: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
7810: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
7820: 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
7830: 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
7840: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
7850: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
7860: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
7870: 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
7880: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
7890: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
78a0: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
78b0: 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
78c0: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
78d0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
78e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
78f0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
7900: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
7910: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
7920: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Data);.    }.  .
7930: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
7940: 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
7950: 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
7960: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
7970: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
7980: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
7990: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
79a0: 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
79b0: 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
79c0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
79d0: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
79e0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
79f0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
7a00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
7a10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7a20: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
7a30: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
7a40: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
7a50: 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
7a60: 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
7a70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
7a80: 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
7a90: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f    sqlitepager_co
7aa0: 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
7ab0: 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
7ac0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
7ad0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
7ae0: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
7af0: 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
7b00: 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
7b10: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  epager_unref() i
7b20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
7b30: 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
7b40: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
7b50: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
7b60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
7b70: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
7b80: 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
7b90: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
7ba0: 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
7bb0: 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
7bc0: 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
7bd0: 65 72 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75  erely.** to acqu
7be0: 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
7bf0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
7c00: 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
7c10: 66 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  f that there.** 
7c20: 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
7c30: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
7c40: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
7c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
7c60: 20 61 6c 72 65 61 64 79 20 77 72 69 74 65 2d 6c   already write-l
7c70: 6f 63 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74  ocked, this rout
7c80: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
7c90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
7ca0: 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70  er_begin(void *p
7cb0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
7cc0: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
7cd0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
7ce0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7cf0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
7d00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7d10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
7d20: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
7d30: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
7d40: 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  e!=SQLITE_UNLOCK
7d50: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7d60: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
7d70: 52 45 41 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  READLOCK ){.    
7d80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7d90: 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
7da0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7db0: 4f 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61  OsWriteLock(&pPa
7dc0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
7dd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7de0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7df0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
7e00: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7e10: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7e20: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
7e30: 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  8 + 1 );.    if(
7e40: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7e50: 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
7e60: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
7e70: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
7e80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7e90: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7ea0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
7eb0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
7ec0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
7ed0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30   &pPager->jfd, 0
7ee0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
7ef0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7f00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
7f10: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
7f20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
7f30: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
7f40: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65        sqliteOsRe
7f50: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
7f60: 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fd);.      retur
7f70: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
7f80: 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  N;.    }.    pPa
7f90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7fa0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
7fb0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
7fc0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
7fd0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7fe0: 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  = SQLITE_WRITELO
7ff0: 43 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61  CK;.    sqlitepa
8000: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
8010: 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
8020: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
8030: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
8040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
8050: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
8060: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
8070: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8080: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
8090: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
80a0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
80b0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
80c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
80d0: 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 73 69 7a  ger->dbSize, siz
80e0: 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
80f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
8100: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8110: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
8120: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8130: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
8140: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
8150: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
8160: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8170: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
8180: 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
8190: 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
81a0: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
81b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
81c0: 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
81d0: 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
81e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
81f0: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
8200: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
8210: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
8220: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
8230: 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
8240: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
8250: 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
8260: 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
8270: 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
8280: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
8290: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
82a0: 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c  f the write.** l
82b0: 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
82c0: 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
82d0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
82e0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
82f0: 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
8300: 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
8310: 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
8320: 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
8330: 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
8340: 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
8350: 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
8360: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
8370: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
8380: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
8390: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
83a0: 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
83b0: 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
83c0: 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
83d0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
83e0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
83f0: 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
8400: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
8410: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
8420: 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
8430: 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
8440: 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
8450: 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
8460: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d   sqlitepager_com
8470: 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 70  mit() or sqlitep
8480: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
8490: 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
84a0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
84b0: 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
84c0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
84d0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
84e0: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
84f0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
8500: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
8510: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
8520: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
8530: 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
8540: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
8550: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
8560: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
8570: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
8580: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
8590: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
85a0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
85b0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
85c0: 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
85d0: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
85e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
85f0: 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
8600: 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
8610: 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
8620: 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
8630: 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
8640: 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
8650: 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43 6b  al && (pPg->inCk
8660: 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 6b  pt || pPager->ck
8670: 70 74 4f 70 65 6e 3d 3d 30 29 20 29 7b 0a 20 20  ptOpen==0) ){.  
8680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8690: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
86a0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
86b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
86c0: 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
86d0: 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
86e0: 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
86f0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
8700: 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
8710: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
8720: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
8730: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
8740: 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
8750: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
8760: 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
8770: 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
8780: 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
8790: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
87a0: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
87b0: 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
87c0: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
87d0: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  (pData);.  if( r
87e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
87f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
8800: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
8810: 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e==SQLITE_WRITEL
8820: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
8830: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8840: 4f 70 65 6e 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  Open );..  /* Th
8850: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
8860: 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
8870: 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 77   and we have a w
8880: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
8890: 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62  .  ** main datab
88a0: 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
88b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
88c0: 65 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  e to the transac
88d0: 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  tion .  ** journ
88e0: 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
88f0: 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
8900: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e   */.  if( !pPg->
8910: 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
8920: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
8930: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8940: 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
8950: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
8960: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e  ger->jfd, &pPg->
8970: 70 67 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e  pgno, sizeof(Pgn
8980: 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  o));.    if( rc=
8990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
89a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
89b0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
89c0: 6a 66 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49  jfd, pData, SQLI
89d0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
89e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
89f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8a00: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
8a10: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
8a20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8a30: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
8a40: 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
8a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8a60: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
8a70: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8a80: 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
8a90: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
8aa0: 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
8ab0: 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
8ac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
8ad0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
8ae0: 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 70 50 67 2d  noSync;.    pPg-
8af0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
8b00: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8b10: 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  ckptOpen ){.    
8b20: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
8b30: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
8b40: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
8b50: 37 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  7);.      pPg->i
8b60: 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d  nCkpt = 1;.    }
8b70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8b80: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
8b90: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
8ba0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
8bb0: 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
8bc0: 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
8bd0: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
8be0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
8bf0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
8c00: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
8c10: 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20  && !pPg->inCkpt 
8c20: 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
8c30: 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  o<=pPager->ckptS
8c40: 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
8c50: 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
8c60: 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
8c70: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
8c80: 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63  DbSize );.    rc
8c90: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
8ca0: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
8cb0: 26 70 50 67 2d 3e 70 67 6e 6f 2c 20 73 69 7a 65  &pPg->pgno, size
8cc0: 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 69  of(Pgno));.    i
8cd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8ce0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
8cf0: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
8d00: 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61 74  ager->cpfd, pDat
8d10: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
8d20: 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IZE);.    }.    
8d30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8d40: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8d50: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
8d60: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
8d70: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
8d80: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
8d90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8da0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
8db0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
8dc0: 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Ckpt!=0 );.    p
8dd0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
8de0: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
8df0: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
8e00: 0a 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  .    pPg->inCkpt
8e10: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
8e20: 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
8e30: 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
8e40: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
8e50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
8e60: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
8e70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
8e80: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
8e90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8eb0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
8ec0: 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
8ed0: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
8ee0: 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
8ef0: 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  * to sqlitepager
8f00: 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  _write().  In ot
8f10: 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
8f20: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
8f30: 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
8f40: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
8f50: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  he page..*/.int 
8f60: 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72  sqlitepager_iswr
8f70: 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44  iteable(void *pD
8f80: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
8f90: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
8fa0: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
8fb0: 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
8fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
8fd0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
8fe0: 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
8ff0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
9000: 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
9010: 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
9020: 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
9030: 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
9040: 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
9050: 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
9060: 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
9070: 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
9080: 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
9090: 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
90a0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
90b0: 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
90c0: 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
90d0: 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
90e0: 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
90f0: 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
9100: 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
9110: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
9120: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
9130: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
9140: 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
9150: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
9160: 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
9170: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e   sqlitepager_don
9180: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
9190: 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
91a0: 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
91b0: 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
91c0: 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
91d0: 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
91e0: 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
91f0: 4c 45 54 45 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  LETEs..*/.void s
9200: 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f  qlitepager_dont_
9210: 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
9220: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9230: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
9240: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9250: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9260: 29 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20  );.  if( pPg && 
9270: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
9280: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
9290: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
92a0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
92b0: 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
92c0: 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
92d0: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
92e0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
92f0: 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
9300: 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
9310: 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
9320: 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
9330: 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
9340: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
9350: 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
9360: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
9370: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
9380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61  */.void sqlitepa
9390: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
93a0: 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
93b0: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
93c0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
93d0: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
93e0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
93f0: 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
9400: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
9410: 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50  _WRITELOCK || pP
9420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
9430: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
9440: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
9450: 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
9460: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
9470: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
9480: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9490: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
94a0: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
94b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
94c0: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
94d0: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
94e0: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
94f0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
9500: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29  ager->ckptOpen )
9510: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
9520: 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e  aInCkpt[pPg->pgn
9530: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
9540: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
9550: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b  pPg->inCkpt = 1;
9560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
9570: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
9580: 6e 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70  n && !pPg->inCkp
9590: 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
95a0: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70  gno<=pPager->ckp
95b0: 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
95c0: 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
95d0: 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
95e0: 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
95f0: 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
9600: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9610: 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20  aInCkpt!=0 );.  
9620: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
9630: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
9640: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
9650: 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 43  7);.    pPg->inC
9660: 6b 70 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  kpt = 1;.  }.}..
9670: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
9680: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
9690: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
96a0: 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
96b0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
96c0: 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
96d0: 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
96e0: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
96f0: 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
9700: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9710: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
9720: 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
9730: 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
9740: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9750: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
9760: 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
9770: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
9780: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
9790: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
97a0: 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
97b0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
97c0: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  = sqlitepager_ro
97d0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
97e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
97f0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
9800: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 72 65  ITE_FULL;.    re
9810: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
9820: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
9830: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
9840: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
9850: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
9860: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
9870: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
9880: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
9890: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
98a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
98b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
98c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
98d0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
98e0: 3e 6e 65 65 64 53 79 6e 63 20 26 26 20 73 71 6c  >needSync && sql
98f0: 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
9900: 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54 45 5f  r->jfd)!=SQLITE_
9910: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
9920: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
9930: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
9940: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
9950: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
9960: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64  {.    if( pPg->d
9970: 69 72 74 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  irty==0 ) contin
9980: 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
9990: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
99a0: 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e  r->fd, (pPg->pgn
99b0: 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45  o-1)*SQLITE_PAGE
99c0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
99d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
99e0: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
99f0: 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  t;.    rc = sqli
9a00: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
9a10: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
9a20: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
9a30: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
9a40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9a50: 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
9a60: 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  t_abort;.  }.  i
9a70: 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
9a80: 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79  nc && sqliteOsSy
9a90: 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21  nc(&pPager->fd)!
9aa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9ab0: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
9ac0: 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
9ad0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
9ae0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
9af0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
9b00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
9b10: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
9b20: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
9b30: 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
9b40: 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
9b50: 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
9b60: 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
9b70: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
9b80: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
9b90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9ba0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9bb0: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
9bc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9bd0: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
9be0: 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
9bf0: 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
9c00: 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65  o read-only mode
9c10: 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
9c20: 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
9c30: 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
9c40: 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
9c50: 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
9c60: 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
9c70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9c80: 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
9c90: 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
9ca0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
9cb0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
9cc0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
9cd0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
9ce0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
9cf0: 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
9d00: 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
9d10: 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
9d20: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
9d30: 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
9d40: 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
9d50: 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
9d60: 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
9d70: 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
9d80: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
9d90: 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
9da0: 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
9db0: 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
9dc0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
9dd0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9de0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9df0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
9e00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9e10: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
9e20: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
9e30: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
9e40: 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f  Mask!=PAGER_ERR_
9e50: 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
9e60: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
9e70: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
9e80: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
9e90: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
9ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
9eb0: 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
9ec0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9ed0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9ee0: 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  !=SQLITE_WRITELO
9ef0: 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
9f00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9f10: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
9f20: 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
9f30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9f40: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
9f50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
9f60: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
9f70: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
9f80: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
9f90: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
9fa0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
9fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9fc0: 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
9fd0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
9fe0: 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
9ff0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
a000: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
a010: 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
a020: 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
a030: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 72   sqlitepager_isr
a040: 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
a050: 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
a060: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
a070: 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
a080: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a090: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
a0a0: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
a0b0: 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 70 61  */.int *sqlitepa
a0c0: 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20  ger_stats(Pager 
a0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
a0e0: 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61  ic int a[9];.  a
a0f0: 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
a100: 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
a110: 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
a120: 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
a130: 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
a140: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
a150: 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
a160: 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
a170: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a  Pager->errMask;.
a180: 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
a190: 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
a1a0: 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
a1b0: 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
a1c0: 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20  nOvfl;.  return 
a1d0: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  a;.}../*.** Set 
a1e0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a  the checkpoint..
a1f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a200: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
a210: 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
a220: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
a230: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
a240: 2e 20 20 41 20 6e 65 77 20 63 68 65 63 6b 70 6f  .  A new checkpo
a250: 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  int journal is c
a260: 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
a270: 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
a280: 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
a290: 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
a2a0: 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
a2b0: 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
a2c0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
a2d0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67 69  epager_ckpt_begi
a2e0: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
a2f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
a300: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
a310: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
a320: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a330: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
a340: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
a350: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 3b 0a  er->ckptOpen );.
a360: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
a370: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
a380: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a390: 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
a3a0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d  pPager->aInCkpt=
a3b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a3c0: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
a3d0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74  er->fd);.    ret
a3e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a3f0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
a400: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
a410: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
a420: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b  ger->ckptJSize);
a430: 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
a440: 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c   ckpt_begin_fail
a450: 65 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ed;.  pPager->ck
a460: 70 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ptSize = pPager-
a470: 3e 64 62 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  >dbSize;.  rc = 
a480: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
a490: 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
a4a0: 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 69 66  ger->cpfd);.  if
a4b0: 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74  ( rc ) goto ckpt
a4c0: 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
a4d0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
a4e0: 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
a4f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b 70  SQLITE_OK;. .ckp
a500: 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
a510: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
a520: 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 73 71 6c  nCkpt ){.    sql
a530: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
a540: 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20 20 70 50  aInCkpt);.    pP
a550: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
a560: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a570: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
a580: 6d 69 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  mit a checkpoint
a590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
a5a0: 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74  ager_ckpt_commit
a5b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
a5c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
a5d0: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 50  kptOpen ){.    P
a5e0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 73  gHdr *pPg;.    s
a5f0: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
a600: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
a610: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
a620: 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  n = 0;.    sqlit
a630: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
a640: 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50  InCkpt );.    pP
a650: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
a660: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
a670: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
a680: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
a690: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
a6a0: 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  >inCkpt = 0;.   
a6b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a6c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a6d0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63  .** Rollback a c
a6e0: 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  heckpoint..*/.in
a6f0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  t sqlitepager_ck
a700: 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  pt_rollback(Page
a710: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
a720: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
a730: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a  er->ckptOpen ){.
a740: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 63      rc = pager_c
a750: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  kpt_playback(pPa
a760: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
a770: 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69  pager_ckpt_commi
a780: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
a790: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
a7a0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
a7b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
a7c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
a7d0: 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
a7e0: 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
a7f0: 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
a800: 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
a810: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
a820: 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
a830: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
a840: 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
a850: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a860: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a870: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
a880: 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
a890: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
a8a0: 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
a8b0: 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66  addr=0x%08x nRef
a8c0: 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
a8d0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29  pPg->pgno, (int)
a8e0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a8f0: 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
a900: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a             }.}.#endif.