/ Hex Artifact Content
Login

Artifact f136f5ba82c896d500a10b6a2e5caea62abf716b:


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 34  : pager.c,v 1.44
0350: 20 32 30 30 32 2f 30 33 2f 30 36 20 32 32 3a 30   2002/03/06 22:0
0360: 31 3a 33 36 20 64 72 68 20 45 78 70 20 24 0a 2a  1:36 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 2a 0a 2a 2a 20 54  allowed..**.** T
3b60: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
3b70: 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74  r is the absolut
3b80: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d  e value of the m
3b90: 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e  xPage parameter.
3ba0: 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73  .** If mxPage is
3bb0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e   negative, the n
3bc0: 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  oSync flag is al
3bd0: 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20  so set.  noSync 
3be0: 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c  bypasses.** call
3bf0: 73 20 74 6f 20 73 71 6c 69 74 65 4f 73 53 79 6e  s to sqliteOsSyn
3c00: 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20  c().  The pager 
3c10: 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  runs much faster
3c20: 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c   with noSync on,
3c30: 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f  .** but if the o
3c40: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3c50: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
3c60: 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f   is an abrupt po
3c70: 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c  wer .** failure,
3c80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3c90: 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  le might be left
3ca0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
3cb0: 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70  ent and.** unrep
3cc0: 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20  airable state.  
3cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
3ce0: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
3cf0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
3d00: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
3d10: 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29   if( mxPage>=0 )
3d20: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
3d30: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
3d40: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
3d50: 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d  oSync = 1;.    m
3d60: 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b  xPage = -mxPage;
3d70: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67  .  }.  if( mxPag
3d80: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
3d90: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
3da0: 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  age;.  }.}../*.*
3db0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
3dc0: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
3dd0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3de0: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
3df0: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
3e00: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
3e10: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
3e20: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
3e30: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
3e40: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
3e50: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
3e60: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
3e70: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
3e80: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
3e90: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
3ea0: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
3eb0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
3ec0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
3ed0: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
3ee0: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
3ef0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61  tic int sqlitepa
3f00: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
3f10: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
3f20: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
3f30: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
3f40: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
3f50: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d  .    sqliteOsTem
3f60: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
3f70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3f80: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
3f90: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
3fa0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
3fb0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
3fc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
3fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3fe0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
3ff0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
4000: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
4010: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
4020: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
4030: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
4040: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
4050: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
4060: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
4070: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
4080: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
4090: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
40a0: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
40b0: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
40c0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
40d0: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
40e0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
40f0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
4100: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
4110: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
4120: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
4130: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
4140: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
4150: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
4160: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
4170: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
4180: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
4190: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
41a0: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
41b0: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
41d0: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
41e0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
41f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
4200: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
4210: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4220: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
4230: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
4240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4250: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
4260: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
4270: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
4280: 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
4290: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
42a0: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
42b0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
42c0: 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  .){.  Pager *pPa
42d0: 67 65 72 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  ger;.  int nameL
42e0: 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b  en;.  OsFile fd;
42f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
4300: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74   tempFile;.  int
4310: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
4320: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
4330: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
4340: 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ];..  *ppPager =
4350: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
4360: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
4370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4380: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
4390: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29   if( zFilename )
43a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
43b0: 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  eOsOpenReadWrite
43c0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 64 2c  (zFilename, &fd,
43d0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
43e0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
43f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
4400: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
4410: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
4420: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
4430: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 74 65   = zTemp;.    te
4440: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a  mpFile = 1;.  }.
4450: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4460: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
4470: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4480: 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  N;.  }.  nameLen
4490: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e   = strlen(zFilen
44a0: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
44b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
44c0: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
44d0: 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33 30 20   nameLen*2 + 30 
44e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
44f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4500: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
4510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4520: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
4530: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
4540: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
4550: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
4560: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
4570: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65  ->zFilename[name
4580: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
4590: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
45a0: 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, zFilename);.
45b0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
45c0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 69 6c 65  >zJournal, zFile
45d0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
45e0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
45f0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
4600: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
4610: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50  r->fd = fd;.  pP
4620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
4630: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
4640: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >ckptOpen = 0;. 
4650: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
4660: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
4670: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
4680: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30  er->ckptSize = 0
4690: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
46a0: 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  JSize = 0;.  pPa
46b0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
46c0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
46d0: 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78   = mxPage>5 ? mx
46e0: 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61  Page : 10;.  pPa
46f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4700: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50  ITE_UNLOCK;.  pP
4710: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
4720: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  0;.  pPager->tem
4730: 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
4740: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
4750: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
4760: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
4770: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
4780: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
4790: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
47a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
47b0: 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20  xtra = nExtra;. 
47c0: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
47d0: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
47e0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
47f0: 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ;.  *ppPager = p
4800: 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
4810: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4820: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
4830: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
4840: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
4850: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
4860: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
4870: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
4880: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
4890: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
48a0: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
48b0: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
48c0: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
48d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
48e0: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
48f0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
4900: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
4910: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
4920: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
4930: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 70 61 67  result sqlitepag
4940: 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  er_close().  .**
4950: 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
4960: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
4970: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
4980: 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
4990: 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65 73  itepager_set_des
49a0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
49b0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
49c0: 65 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20  esc)(void*)){.  
49d0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
49e0: 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
49f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4a00: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4a10: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
4a20: 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
4a30: 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
4a40: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
4a50: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
4a60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
4a70: 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
4a80: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
4a90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
4aa0: 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72  Size>=0 ){.    r
4ab0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62  eturn pPager->db
4ac0: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Size;.  }.  if( 
4ad0: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
4ae0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  (&pPager->fd, &n
4af0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
4b00: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
4b10: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
4b20: 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72  _DISK;.    retur
4b30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20  n 0;.  }.  n /= 
4b40: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
4b50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4b60: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
4b70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  LOCK ){.    pPag
4b80: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
4b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
4ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
4bb0: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
4bc0: 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
4bd0: 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
4be0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
4bf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
4c00: 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
4c10: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4c20: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
4c30: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
4c40: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
4c50: 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
4c60: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
4c70: 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
4c80: 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
4c90: 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
4ca0: 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
4cb0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
4cc0: 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
4cd0: 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
4ce0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
4cf0: 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
4d00: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
4d10: 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  mp..*/.int sqlit
4d20: 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67  epager_close(Pag
4d30: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
4d40: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
4d50: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  t;.  switch( pPa
4d60: 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
4d70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 52    case SQLITE_WR
4d80: 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  ITELOCK: {.     
4d90: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
4da0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
4db0: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c       sqliteOsUnl
4dc0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
4dd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4de0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4df0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
4e00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4e10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
4e20: 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73  DLOCK: {.      s
4e30: 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70  qliteOsUnlock(&p
4e40: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
4e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4e60: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4e70: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
4e80: 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
4e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4ea0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4eb0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
4ec0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
4ed0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
4ee0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4ef0: 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Pg);.  }.  sqlit
4f00: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
4f10: 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28  ->fd);.  assert(
4f20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4f30: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Open==0 );.  if(
4f40: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
4f50: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  e ){.    /* sqli
4f60: 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  teOsDelete(pPage
4f70: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 2a  r->zFilename); *
4f80: 2f 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  /.  }.  sqliteFr
4f90: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
4fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4fc0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
4fd0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
4fe0: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
4ff0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
5000: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
5010: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
5020: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
5030: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
5040: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
5050: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
5060: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
5070: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
5080: 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a  f the page is.**
5090: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
50a0: 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
50b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
50c0: 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
50d0: 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
50e0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
50f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
5100: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
5110: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
5120: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
5130: 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
5140: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
5150: 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
5160: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
5170: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
5180: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
5190: 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
51a0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
51b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51c0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
51d0: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
51e0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
51f0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
5200: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
5210: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
5220: 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
5230: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
5240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
5250: 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
5260: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
5270: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
5280: 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
5290: 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
52a0: 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
52b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
52c0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
52d0: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
52e0: 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
52f0: 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
5300: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
5310: 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
5320: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
5330: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
5340: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
5350: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
5360: 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
5370: 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
5380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5390: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
53a0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20 77  urnal and then w
53b0: 72 69 74 65 20 61 6c 6c 20 66 72 65 65 20 64 69  rite all free di
53c0: 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
53d0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
53e0: 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67  e..**.** Writing
53f0: 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20   all free dirty 
5400: 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
5410: 61 62 61 73 65 20 61 66 74 65 72 20 74 68 65 20  abase after the 
5420: 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e  sync is a.** non
5430: 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a  -obvious optimiz
5440: 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20  ation.  fsync() 
5450: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
5460: 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a  operation so we.
5470: 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d  ** want to minim
5480: 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ize the number o
5490: 74 20 74 69 6d 65 73 20 69 74 20 69 73 20 63 61  t times it is ca
54a0: 6c 6c 65 64 2e 20 41 66 74 65 72 20 61 6e 20 66  lled. After an f
54b0: 73 79 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20  sync() call,.** 
54c0: 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 77  we are free to w
54d0: 72 69 74 65 20 64 69 72 74 79 20 70 61 67 65 73  rite dirty pages
54e0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
54f0: 61 62 61 73 65 2e 20 20 49 74 20 69 73 20 62 65  abase.  It is be
5500: 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  st.** to go ahea
5510: 64 20 61 6e 64 20 77 72 69 74 65 20 61 73 20 6d  d and write as m
5520: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
5530: 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d  as possible to m
5540: 69 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65 20  inimize .** the 
5550: 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74  risk of having t
5560: 6f 20 64 6f 20 61 6e 6f 74 68 65 72 20 66 73 79  o do another fsy
5570: 6e 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20  nc() later on.  
5580: 57 72 69 74 69 6e 67 20 64 69 72 74 79 0a 2a 2a  Writing dirty.**
5590: 20 66 72 65 65 20 70 61 67 65 73 20 69 6e 20 74   free pages in t
55a0: 68 69 73 20 77 61 79 20 77 61 73 20 6f 62 73 65  his way was obse
55b0: 72 76 65 64 20 74 6f 20 6d 61 6b 65 20 64 61 74  rved to make dat
55c0: 61 62 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  abase operations
55d0: 20 67 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30 20   go.** up to 10 
55e0: 74 69 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2a  times faster..**
55f0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 77 72  .** If we are wr
5600: 69 74 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72 61  iting to tempora
5610: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
5620: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
5630: 20 70 72 65 73 65 72 76 65 0a 2a 2a 20 74 68 65   preserve.** the
5640: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
5650: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
5660: 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 74  so we can save t
5670: 69 6d 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ime and skip the
5680: 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a  .** fsync()..*/.
5690: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41  static int syncA
56a0: 6c 6c 50 61 67 65 73 28 50 61 67 65 72 20 2a 70  llPages(Pager *p
56b0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
56c0: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
56d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
56e0: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
56f0: 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
5700: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
5710: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5720: 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67  liteOsSync(&pPag
5730: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
5740: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
5750: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
5760: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
5770: 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  c = 0;.  }.  for
5780: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 46 69  (pPg=pPager->pFi
5790: 72 73 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  rst; pPg; pPg=pP
57a0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 29 7b 0a 20  g->pNextFree){. 
57b0: 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
57c0: 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
57d0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
57e0: 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d  >fd, (pPg->pgno-
57f0: 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  1)*SQLITE_PAGE_S
5800: 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  IZE);.      rc =
5810: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
5820: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
5830: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
5840: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
5860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
5870: 61 6b 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ak;.      pPg->d
5880: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
5890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
58a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
58b0: 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
58c0: 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
58d0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
58e0: 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
58f0: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
5900: 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
5910: 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
5920: 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
5930: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
5940: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
5950: 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
5960: 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
5970: 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
5980: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
5990: 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
59a0: 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
59b0: 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
59c0: 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
59d0: 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
59e0: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
59f0: 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
5a00: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5a10: 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
5a20: 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
5a30: 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
5a40: 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
5a50: 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
5a60: 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
5a70: 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
5a80: 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
5a90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
5aa0: 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
5ab0: 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
5ac0: 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
5ad0: 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
5ae0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
5af0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
5b00: 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
5b10: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
5b20: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
5b30: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e  epager_lookup().
5b40: 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
5b50: 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
5b60: 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
5b70: 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
5b80: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
5b90: 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
5ba0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
5bb0: 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
5bc0: 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
5bd0: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
5be0: 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
5bf0: 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
5c00: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
5c10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
5c20: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
5c30: 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
5c40: 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
5c50: 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
5c60: 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
5c70: 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
5c80: 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
5c90: 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
5ca0: 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
5cb0: 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
5cc0: 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
5cd0: 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
5ce0: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
5cf0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
5d00: 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
5d10: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
5d20: 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
5d30: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
5d40: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
5d50: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
5d60: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
5d70: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
5d80: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
5d90: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5da0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5db0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
5dc0: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
5dd0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
5de0: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
5df0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
5e00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
5e10: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
5e20: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
5e30: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
5e40: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
5e50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
5e60: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
5e70: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
5e80: 20 69 66 28 20 73 71 6c 69 74 65 4f 73 52 65 61   if( sqliteOsRea
5e90: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
5ea0: 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  d)!=SQLITE_OK ){
5eb0: 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
5ec0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
5ed0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5ee0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
5ef0: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
5f00: 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a  EADLOCK;..    /*
5f10: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
5f20: 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20 74  le exists, try t
5f30: 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a  o play it back..
5f40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
5f50: 71 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74  qliteOsFileExist
5f60: 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
5f70: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e  al) ){.       in
5f80: 74 20 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20  t rc, dummy;..  
5f90: 20 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72       /* Get a wr
5fa0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
5fb0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5fc0: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
5fd0: 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b  qliteOsWriteLock
5fe0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
5ff0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
6000: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6010: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
6020: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
6030: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61  >fd);.         a
6040: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6050: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
6060: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
6070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
6080: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
6090: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
60a0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
60b0: 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20  E_WRITELOCK;..  
60c0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
60d0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63   journal for exc
60e0: 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 20 20  lusive access.  
60f0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
6100: 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20  SY if.       ** 
6110: 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78  we cannot get ex
6120: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74  clusive access t
6130: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6140: 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
6150: 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 74 68        ** Even th
6160: 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e 6c  ough we will onl
6170: 79 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  y be reading fro
6180: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e  m the journal, n
6190: 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20 20 20  ot writing,.    
61a0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f     ** we have to
61b0: 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
61c0: 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 6e  l for writing in
61d0: 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61 69 6e   order to obtain
61e0: 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65 78   an.       ** ex
61f0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6c  clusive access l
6200: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
6210: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6220: 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  eOsOpenReadWrite
6230: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
6240: 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
6250: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20   &dummy);.      
6260: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6270: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
6280: 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f  c = sqliteOsUnlo
6290: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
62a0: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
62b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
62c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50  );.         *ppP
62d0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
62e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
62f0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
6300: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
6310: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 0a  urnalOpen = 1;..
6320: 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
6330: 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
6340: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
6350: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
6360: 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
6370: 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
6380: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
6390: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
63a0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
63b0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
63c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
63d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
63e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
63f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6400: 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
6410: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
6420: 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
6430: 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
6440: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
6450: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
6460: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
6470: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
6480: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
6490: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
64a0: 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
64b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ;.    pPager->nM
64c0: 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  iss++;.    if( p
64d0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
64e0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
64f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
6500: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
6510: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
6520: 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  /.      pPg = sq
6530: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6540: 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
6550: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 70 50  E_PAGE_SIZE + pP
6560: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a  ager->nExtra );.
6570: 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
6580: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   ){.        *ppP
6590: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
65a0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
65b0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
65c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
65d0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
65e0: 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
65f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6600: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
6610: 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
6620: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
6630: 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
6640: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
6650: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
6660: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  l ){.        pPa
6670: 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76  ger->pAll->pPrev
6680: 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
6690: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
66a0: 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  revAll = 0;.    
66b0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
66c0: 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
66d0: 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
66e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
66f0: 20 52 65 63 79 63 6c 65 20 61 6e 20 6f 6c 64 65   Recycle an olde
6700: 72 20 70 61 67 65 2e 20 20 46 69 72 73 74 20 6c  r page.  First l
6710: 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20 74  ocate the page t
6720: 6f 20 62 65 20 72 65 63 79 63 6c 65 64 2e 0a 20  o be recycled.. 
6730: 20 20 20 20 20 2a 2a 20 54 72 79 20 74 6f 20 66       ** Try to f
6740: 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ind one that is 
6750: 6e 6f 74 20 64 69 72 74 79 20 61 6e 64 20 69 73  not dirty and is
6760: 20 6e 65 61 72 20 74 68 65 20 68 65 61 64 20 6f   near the head o
6770: 66 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  f.      ** of th
6780: 65 20 66 72 65 65 20 6c 69 73 74 20 2a 2f 0a 20  e free list */. 
6790: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
67a0: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
67b0: 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70   while( pPg && p
67c0: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
67d0: 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
67e0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
67f0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
6800: 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
6810: 64 20 61 20 70 61 67 65 20 74 68 61 74 20 68 61  d a page that ha
6820: 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20  s not been used 
6830: 72 65 63 65 6e 74 6c 79 0a 20 20 20 20 20 20 2a  recently.      *
6840: 2a 20 61 6e 64 20 77 68 69 63 68 20 69 73 20 6e  * and which is n
6850: 6f 74 20 64 69 72 74 79 2c 20 74 68 65 6e 20 73  ot dirty, then s
6860: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6870: 61 6e 64 20 77 72 69 74 65 20 61 6c 6c 0a 20 20  and write all.  
6880: 20 20 20 20 2a 2a 20 64 69 72 74 79 20 66 72 65      ** dirty fre
6890: 65 20 70 61 67 65 73 20 69 6e 74 6f 20 74 68 65  e pages into the
68a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
68b0: 74 68 75 73 20 6d 61 6b 69 6e 67 20 74 68 65 6d  thus making them
68c0: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
68d0: 70 61 67 65 73 20 61 6e 64 20 61 76 61 69 6c 61  pages and availa
68e0: 62 6c 65 20 66 6f 72 20 72 65 63 79 63 6c 69 6e  ble for recyclin
68f0: 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  g..      **.    
6900: 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
6910: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
6920: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
6930: 61 20 70 61 67 65 20 74 6f 20 74 68 65 20 6d 61  a page to the ma
6940: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  in.      ** data
6950: 62 61 73 65 2e 20 20 42 75 74 20 73 79 6e 63 69  base.  But synci
6960: 6e 67 20 69 73 20 61 20 76 65 72 79 20 73 6c 6f  ng is a very slo
6970: 77 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 6f  w operation.  So
6980: 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a   after a.      *
6990: 2a 20 73 79 6e 63 2c 20 69 74 20 69 73 20 62 65  * sync, it is be
69a0: 73 74 20 74 6f 20 77 72 69 74 65 20 65 76 65 72  st to write ever
69b0: 79 74 68 69 6e 67 20 77 65 20 63 61 6e 20 62 61  ything we can ba
69c0: 63 6b 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  ck to the main. 
69d0: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
69e0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
69f0: 20 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20   risk of having 
6a00: 74 6f 20 73 79 6e 63 20 61 67 61 69 6e 20 69 6e  to sync again in
6a10: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
6a20: 61 72 20 66 75 74 75 72 65 2e 20 20 54 68 61 74  ar future.  That
6a30: 20 69 73 20 77 61 79 20 77 65 20 77 72 69 74 65   is way we write
6a40: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
6a50: 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a   after a.      *
6a60: 2a 20 73 79 6e 63 2e 0a 20 20 20 20 20 20 2a 2f  * sync..      */
6a70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
6a80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
6a90: 20 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50 61 67   rc = syncAllPag
6aa0: 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
6ab0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6ad0: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
6ae0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
6af0: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
6b00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6b10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b30: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
6b40: 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
6b50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
6b60: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
6b70: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6b80: 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  dirty==0 );..   
6b90: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
6ba0: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
6bb0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
6bc0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
6bd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
6be0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
6bf0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
6c00: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
6c10: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
6c20: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
6c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6c40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
6c50: 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irst==pPg );.   
6c60: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
6c70: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
6c80: 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Free;.      }.  
6c90: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
6ca0: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
6cb0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
6cc0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
6cd0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
6ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6cf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
6d00: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
6d10: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
6d20: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
6d30: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
6d40: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
6d50: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
6d60: 65 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  evFree = 0;.    
6d70: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
6d80: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
6d90: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
6da0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
6db0: 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20  >pPrevHash;.    
6dc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
6dd0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
6de0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
6df0: 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
6e00: 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
6e10: 73 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sh;.      }else{
6e20: 0a 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67  .        h = pag
6e30: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
6e40: 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  o);.        asse
6e50: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
6e60: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
6e70: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61       pPager->aHa
6e80: 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
6e90: 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a  xtHash;.      }.
6ea0: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
6eb0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
6ec0: 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  vHash = 0;.     
6ed0: 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b   pPager->nOvfl++
6ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
6ef0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
6f00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
6f10: 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
6f20: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
6f30: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
6f40: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
6f50: 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
6f60: 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
6f70: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
6f80: 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  !=0;.    }else{.
6f90: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
6fa0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rnal = 0;.    }.
6fb0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6fc0: 61 49 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29  aInCkpt && (int)
6fd0: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b  pgno<=pPager->ck
6fe0: 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ptSize ){.      
6ff0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 28 70  pPg->inCkpt = (p
7000: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
7010: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
7020: 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
7030: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
7040: 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20  ->inCkpt = 0;.  
7050: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
7060: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
7070: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
7080: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
7090: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
70a0: 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
70b0: 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
70c0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
70d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
70e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
70f0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
7100: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
7110: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
7120: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
7130: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
7140: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
7150: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
7160: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
7170: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7180: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71  r->dbSize<0 ) sq
7190: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
71a0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
71b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
71c0: 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b  ize<(int)pgno ){
71d0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
71e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
71f0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
7200: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73  _SIZE);.    }els
7210: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  e{.      int rc;
7220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53  .      sqliteOsS
7230: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
7240: 20 28 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45   (pgno-1)*SQLITE
7250: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
7260: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
7270: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
7280: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
7290: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
72a0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
72b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
72c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
72d0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
72e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
72f0: 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
7300: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
7310: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
7320: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
7330: 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtra);.    }.  }
7340: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
7350: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
7360: 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
7370: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ache. */.    pPa
7380: 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20  ger->nHit++;.   
7390: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
73a0: 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
73b0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
73c0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
73d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
73e0: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
73f0: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
7400: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
7410: 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
7420: 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
7430: 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
7440: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7450: 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
7460: 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
7470: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
7480: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
7490: 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
74a0: 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
74b0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
74c0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
74d0: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
74e0: 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
74f0: 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
7500: 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
7510: 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
7520: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
7530: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
7540: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7550: 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
7560: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
7570: 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
7580: 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
7590: 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
75a0: 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
75b0: 20 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f   *sqlitepager_lo
75c0: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
75d0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
75e0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
75f0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
7600: 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
7610: 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
7620: 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  s..  */ .  if( p
7630: 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f  Pager==0 || pgno
7640: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7650: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
7660: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
7670: 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
7680: 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
7690: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
76a0: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
76b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
76c0: 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
76d0: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
76e0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
76f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7700: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
7710: 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
7720: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
7730: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
7740: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
7750: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
7760: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
7770: 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
7780: 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
7790: 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
77a0: 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
77b0: 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
77c0: 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
77d0: 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
77e0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
77f0: 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
7800: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
7810: 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
7820: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
7830: 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
7840: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
7850: 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
7860: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
7870: 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
7880: 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
7890: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
78a0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
78b0: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
78c0: 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
78d0: 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
78e0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
78f0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
7900: 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
7910: 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
7920: 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
7930: 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
7940: 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
7950: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
7960: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
7970: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
7980: 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
7990: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
79a0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
79b0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
79c0: 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
79d0: 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
79e0: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
79f0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
7a00: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
7a10: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
7a20: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
7a30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7a40: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
7a50: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
7a60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
7a70: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
7a80: 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
7a90: 72 75 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20  ructor(pData);. 
7aa0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
7ab0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
7ac0: 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
7ad0: 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
7ae0: 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
7af0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7b00: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
7b10: 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
7b20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7b30: 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
7b40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
7b50: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
7b60: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
7b70: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
7b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
7ba0: 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
7bb0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
7bc0: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
7bd0: 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
7be0: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
7bf0: 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
7c00: 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
7c10: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69  pager_commit() i
7c20: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
7c30: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
7c40: 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
7c50: 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
7c60: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  tepager_close() 
7c70: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
7c80: 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  *  sqlitepager_u
7c90: 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
7ca0: 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
7cb0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
7cc0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
7cd0: 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
7ce0: 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
7cf0: 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
7d00: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
7d10: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
7d20: 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
7d30: 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
7d40: 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a 2a 2a  s used merely.**
7d50: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 70 6f   to acquire a po
7d60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
7d70: 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
7d80: 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
7d90: 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  here.** is alrea
7da0: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
7db0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
7dc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
7dd0: 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
7de0: 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20 74   write-locked, t
7df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7e00: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
7e10: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
7e20: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
7e30: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
7e40: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
7e50: 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
7e60: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
7e70: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
7e80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
7e90: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
7ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
7eb0: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
7ec0: 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  E_UNLOCK );.  if
7ed0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
7ee0: 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b  =SQLITE_READLOCK
7ef0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7f00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7f10: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
7f20: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c  = sqliteOsWriteL
7f30: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
7f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7f50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7f60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7f70: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  }.    pPager->aI
7f80: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
7f90: 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
7fa0: 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
7fb0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7fc0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
7fd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  {.      sqliteOs
7fe0: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
7ff0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74  ->fd);.      ret
8000: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
8020: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63   sqliteOsOpenExc
8030: 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
8040: 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
8050: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 69  ->jfd, 0);.    i
8060: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8070: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8080: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
8090: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
80a0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
80b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  al = 0;.      sq
80c0: 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
80d0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
80e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
80f0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
8100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
8110: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
8120: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8130: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
8140: 53 79 6e 63 3b 0a 20 20 20 20 70 50 61 67 65 72  Sync;.    pPager
8150: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
8160: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20  _WRITELOCK;.    
8170: 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65  sqlitepager_page
8180: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
8190: 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
81a0: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
81b0: 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  dbSize;.    rc =
81c0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
81d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
81e0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
81f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8200: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ));.    if( rc==
8210: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8220: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
8230: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
8240: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  fd, &pPager->dbS
8250: 69 7a 65 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ize, sizeof(Pgno
8260: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
8270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8280: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
8290: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
82a0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
82b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
82c0: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46   ) rc = SQLITE_F
82d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
82e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
82f0: 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
8300: 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
8310: 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
8320: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8330: 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
8340: 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
8350: 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
8360: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
8370: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
8380: 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
8390: 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
83a0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
83b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
83c0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
83d0: 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
83e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
83f0: 63 71 75 69 72 65 73 20 61 20 77 72 69 74 65 20  cquires a write 
8400: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
8410: 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 77 72  base.  If the wr
8420: 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  ite.** lock coul
8430: 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
8440: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
8450: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
8460: 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
8470: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
8480: 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
8490: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
84a0: 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
84b0: 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
84c0: 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
84d0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
84e0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
84f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
8510: 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
8520: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
8530: 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
8540: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8550: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
8560: 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
8570: 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
8580: 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
8590: 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
85a0: 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
85b0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
85c0: 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
85d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70   call to sqlitep
85e0: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72  ager_commit() or
85f0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
8600: 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
8610: 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
8620: 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f  tepager_write(vo
8630: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
8640: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
8650: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
8660: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
8670: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
8680: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8690: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
86a0: 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
86b0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
86c0: 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20  errMask ){ .    
86d0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
86e0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
86f0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
8700: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
8710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
8720: 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  RM;.  }..  /* Ma
8730: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
8740: 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
8750: 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
8760: 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
8770: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
8780: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
8790: 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
87a0: 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
87b0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
87c0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
87d0: 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70 50  Pg->inCkpt || pP
87e0: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 3d 3d  ager->ckptOpen==
87f0: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
8800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8810: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
8820: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
8830: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
8840: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a   needs to be.  *
8850: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
8860: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
8870: 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
8880: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
8890: 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a   ** or both..  *
88a0: 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65  *.  ** First che
88b0: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
88c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
88d0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
88e0: 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74  d.  ** create it
88f0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
8900: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8910: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
8920: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  QLITE_UNLOCK );.
8930: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
8940: 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b  er_begin(pData);
8950: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8960: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8980: 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54  er->state==SQLIT
8990: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20  E_WRITELOCK );. 
89a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
89b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
89c0: 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  .  /* The transa
89d0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
89e0: 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
89f0: 68 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63  have a write loc
8a00: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61  k on the.  ** ma
8a10: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
8a20: 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
8a30: 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
8a40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
8a50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  ** journal if it
8a60: 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
8a70: 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ready..  */.  if
8a80: 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
8a90: 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
8aa0: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
8ab0: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
8ac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
8ad0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
8ae0: 2c 20 26 70 50 67 2d 3e 70 67 6e 6f 2c 20 73 69  , &pPg->pgno, si
8af0: 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
8b00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8b10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
8b20: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
8b30: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
8b40: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
8b50: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SIZE);.    }.   
8b60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8b70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8b80: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
8b90: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
8ba0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
8bb0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
8bc0: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
8bd0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
8be0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
8bf0: 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
8c00: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
8c10: 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
8c20: 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
8c30: 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 61 67  gno&7);.    pPag
8c40: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
8c50: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
8c60: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
8c70: 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
8c80: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
8c90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
8ca0: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
8cb0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
8cc0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
8cd0: 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20    pPg->inCkpt = 
8ce0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
8cf0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 70  /* If the checkp
8d00: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  oint journal is 
8d10: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
8d20: 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
8d30: 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
8d40: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
8d50: 20 74 6f 20 74 68 65 20 63 68 65 63 6b 70 6f 69   to the checkpoi
8d60: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
8d70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
8d80: 6b 70 74 4f 70 65 6e 20 26 26 20 21 70 50 67 2d  kptOpen && !pPg-
8d90: 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29  >inCkpt && (int)
8da0: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
8db0: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20  r->ckptSize ){. 
8dc0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
8dd0: 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
8de0: 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
8df0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
8e00: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8e10: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
8e20: 2d 3e 63 70 66 64 2c 20 26 70 50 67 2d 3e 70 67  ->cpfd, &pPg->pg
8e30: 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  no, sizeof(Pgno)
8e40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
8e50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
8e70: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70  rite(&pPager->cp
8e80: 66 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54  fd, pData, SQLIT
8e90: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
8ea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
8eb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8ec0: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
8ed0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
8ee0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
8ef0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
8f00: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
8f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8f20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8f30: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20  ger->aInCkpt!=0 
8f40: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8f50: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
8f60: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
8f70: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
8f80: 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20  ->inCkpt = 1;.  
8f90: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
8fb0: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
8fc0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
8fd0: 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
8fe0: 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
8ff0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
9000: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
9010: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9020: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
9030: 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
9040: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
9050: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
9060: 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
9070: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 29  itepager_write()
9080: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
9090: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
90a0: 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
90b0: 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
90c0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
90d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
90e0: 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
90f0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
9100: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
9110: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
9120: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
9130: 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >dirty;.}../*.**
9140: 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
9150: 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
9160: 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
9170: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
9180: 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
9190: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
91a0: 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
91b0: 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
91c0: 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
91d0: 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
91e0: 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
91f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
9200: 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
9210: 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
9220: 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
9230: 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
9240: 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
9250: 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
9260: 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
9270: 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
9280: 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
9290: 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
92a0: 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
92b0: 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
92c0: 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
92d0: 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
92e0: 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 70  h the.** sqlitep
92f0: 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
9300: 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
9310: 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
9320: 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
9330: 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
9340: 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
9350: 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
9360: 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
9370: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
9380: 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
9390: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
93a0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
93b0: 20 2a 70 50 67 3b 0a 20 20 70 50 67 20 3d 20 70   *pPg;.  pPg = p
93c0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
93d0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
93e0: 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
93f0: 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
9400: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  irty = 0;.  }.}.
9410: 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
9420: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
9430: 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
9440: 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
9450: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
9460: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
9470: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
9480: 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
9490: 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
94a0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
94b0: 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
94c0: 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
94d0: 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
94e0: 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
94f0: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
9500: 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74  sqlitepager_dont
9510: 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
9520: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
9530: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
9540: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
9550: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
9560: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
9570: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9580: 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  !=SQLITE_WRITELO
9590: 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  CK || pPager->jo
95a0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
95b0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
95c0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
95d0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
95e0: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
95f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
9600: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
9610: 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
9620: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
9630: 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
9640: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
9650: 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
9660: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
9670: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b    if( pPager->ck
9680: 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  ptOpen ){.      
9690: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
96a0: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
96b0: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
96c0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  ;.      pPg->inC
96d0: 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  kpt = 1;.    }. 
96e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
96f0: 3e 63 6b 70 74 4f 70 65 6e 20 26 26 20 21 70 50  >ckptOpen && !pP
9700: 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e  g->inCkpt && (in
9710: 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
9720: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b  ger->ckptSize ){
9730: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
9740: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
9750: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
9760: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
9770: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9780: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21  pPager->aInCkpt!
9790: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
97a0: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
97b0: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
97c0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
97d0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b  pPg->inCkpt = 1;
97e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
97f0: 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
9800: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9810: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
9820: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
9830: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
9840: 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
9850: 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
9860: 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
9870: 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
9880: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
9890: 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
98a0: 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
98b0: 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
98c0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
98d0: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  tepager_commit(P
98e0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
98f0: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9900: 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
9910: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50  ager->errMask==P
9920: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
9930: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9940: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
9950: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
9960: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
9970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
9980: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
9990: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
99a0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
99b0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
99c0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
99d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
99e0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
99f0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
9a00: 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
9a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
9a20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
9a30: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
9a40: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28  nalOpen );.  if(
9a50: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9a60: 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79 6e  c && sqliteOsSyn
9a70: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 21  c(&pPager->jfd)!
9a80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9a90: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
9aa0: 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ort;.  }.  for(p
9ab0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
9ac0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
9ad0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
9ae0: 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
9af0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9b00: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65  rc = sqliteOsSee
9b10: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
9b20: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c  pPg->pgno-1)*SQL
9b30: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
9b40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9b50: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
9b60: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 72  mit_abort;.    r
9b70: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
9b80: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
9b90: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9ba0: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
9bb0: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63  IZE);.    if( rc
9bc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
9bd0: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
9be0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
9bf0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71  er->noSync && sq
9c00: 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67  liteOsSync(&pPag
9c10: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
9c20: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
9c30: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
9c40: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e  .  rc = pager_un
9c50: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
9c60: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
9c70: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
9c80: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
9c90: 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69  p here if anythi
9ca0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75  ng goes wrong du
9cb0: 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
9cc0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f  process..  */.co
9cd0: 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63  mmit_abort:.  rc
9ce0: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72   = sqlitepager_r
9cf0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
9d00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
9d20: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
9d30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9d40: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
9d50: 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
9d60: 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
9d70: 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f  s back to read-o
9d80: 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  nly mode..** All
9d90: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
9da0: 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
9db0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
9dc0: 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
9dd0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
9de0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
9df0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
9e00: 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
9e10: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9e20: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
9e30: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
9e40: 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
9e50: 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
9e60: 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
9e70: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
9e80: 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
9e90: 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
9ea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
9eb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
9ec0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
9ed0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
9ee0: 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
9ef0: 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
9f00: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
9f10: 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
9f20: 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
9f30: 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
9f40: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
9f50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
9f60: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  t sqlitepager_ro
9f70: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
9f80: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
9f90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
9fa0: 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
9fb0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
9fc0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
9fd0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9fe0: 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52  state>=SQLITE_WR
9ff0: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ITELOCK ){.     
a000: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
a010: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
a020: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
a030: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
a040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
a050: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
a060: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20  _WRITELOCK ){.  
a070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a080: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  OK;.  }.  rc = p
a090: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
a0a0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
a0b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a0c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
a0d0: 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65  RRUPT;.    pPage
a0e0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
a0f0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
a100: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
a110: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
a120: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a130: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
a140: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a150: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
a160: 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
a170: 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
a180: 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
a190: 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
a1a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
a1b0: 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
a1c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a1d0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
a1e0: 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
a1f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
a210: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
a220: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
a230: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74  sqlitepager_stat
a240: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
a250: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
a260: 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  [9];.  a[0] = pP
a270: 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
a280: 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
a290: 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
a2a0: 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
a2b0: 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
a2c0: 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
a2d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
a2e0: 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
a2f0: 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d  rrMask;.  a[6] =
a300: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
a310: 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
a320: 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
a330: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
a340: 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a   return a;.}../*
a350: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 68 65 63  .** Set the chec
a360: 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  kpoint..**.** Th
a370: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
a380: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
a390: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a3a0: 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
a3b0: 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
a3c0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
a3d0: 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
a3e0: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
a3f0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
a400: 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
a410: 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
a420: 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
a430: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
a440: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
a450: 6b 70 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  kpt_begin(Pager 
a460: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
a470: 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
a480: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
a490: 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
a4a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a4b0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72  lOpen );.  asser
a4c0: 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70 74  t( !pPager->ckpt
a4d0: 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
a4e0: 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c 69  ->aInCkpt = sqli
a4f0: 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
a500: 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
a510: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
a520: 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20 20  aInCkpt==0 ){.  
a530: 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f    sqliteOsReadLo
a540: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
a550: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a560: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
a570: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c  rc = sqliteOsFil
a580: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
a590: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 70  fd, &pPager->ckp
a5a0: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
a5b0: 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65  c ) goto ckpt_be
a5c0: 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 70 50  gin_failed;.  pP
a5d0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d  ager->ckptSize =
a5e0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
a5f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61  .  rc = sqlitepa
a600: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
a610: 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66  mp, &pPager->cpf
a620: 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  d);.  if( rc ) g
a630: 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
a640: 61 69 6c 65 64 3b 0a 20 20 70 50 61 67 65 72 2d  ailed;.  pPager-
a650: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >ckptOpen = 1;. 
a660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a670: 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f  K;. .ckpt_begin_
a680: 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
a690: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b  ager->aInCkpt ){
a6a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a6b0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29  pPager->aInCkpt)
a6c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
a6d0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nCkpt = 0;.  }. 
a6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a6f0: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68  *.** Commit a ch
a700: 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
a710: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
a720: 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
a730: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
a740: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
a750: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
a760: 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43  g;.    sqliteOsC
a770: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 63 70  lose(&pPager->cp
a780: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
a790: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >ckptOpen = 0;. 
a7a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
a7b0: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29  Pager->aInCkpt )
a7c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
a7d0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 66  nCkpt = 0;.    f
a7e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
a7f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
a800: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
a810: 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20      pPg->inCkpt 
a820: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
a830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a840: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
a850: 62 61 63 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e  back a checkpoin
a860: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
a870: 70 61 67 65 72 5f 63 6b 70 74 5f 72 6f 6c 6c 62  pager_ckpt_rollb
a880: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
a890: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
a8a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  if( pPager->ckpt
a8b0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
a8c0: 20 70 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79   pager_ckpt_play
a8d0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
a8e0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b    sqlitepager_ck
a8f0: 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  pt_commit(pPager
a900: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a930: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .}..#if SQLITE_T
a940: 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  EST./*.** Print 
a950: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
a960: 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
a970: 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
a980: 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
a990: 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 64 75  qlitepager_refdu
a9a0: 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
a9b0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
a9c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
a9d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
a9e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
a9f0: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
aa00: 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
aa10: 65 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  e;.    printf("P
aa20: 41 47 45 20 25 33 64 20 61 64 64 72 3d 30 78 25  AGE %3d addr=0x%
aa30: 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  08x nRef=%d\n", 
aa40: 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
aa50: 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f  o, (int)PGHDR_TO
aa60: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
aa70: 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
aa80: 6e 64 69 66 0a                                   ndif.