/ Hex Artifact Content
Login

Artifact 4b0169e91b34f6ff91e8feb57545c43e4d6eb370:


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 35 31  : pager.c,v 1.51
0350: 20 32 30 30 32 2f 30 38 2f 31 33 20 30 30 3a 30   2002/08/13 00:0
0360: 31 3a 31 37 20 64 72 68 20 45 78 70 20 24 0a 2a  1:17 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 75 38 20 69 6e 4a 6f  ges */.  u8 inJo
0ca0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
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 75 38 20 69 6e 43 6b 70 74 3b 20 20  /.  u8 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 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 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 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
0d90: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
0da0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
0db0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
0dc0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 2f  this page */.  /
0dd0: 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  * SQLITE_PAGE_SI
0de0: 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ZE bytes of page
0df0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
0e00: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
0e10: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
0e20: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
0e30: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
0e40: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
0e50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f  .** Convert a po
0e60: 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72  inter to a PgHdr
0e70: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
0e80: 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61  to its data.** a
0e90: 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a  nd back again..*
0ea0: 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  /.#define PGHDR_
0eb0: 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f  TO_DATA(P)  ((vo
0ec0: 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23  id*)(&(P)[1])).#
0ed0: 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50  define DATA_TO_P
0ee0: 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48  GHDR(D)  (&((PgH
0ef0: 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64  dr*)(D))[-1]).#d
0f00: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45  efine PGHDR_TO_E
0f10: 58 54 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29  XTRA(P) ((void*)
0f20: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
0f30: 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ]))[SQLITE_PAGE_
0f40: 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  SIZE])../*.** Ho
0f50: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
0f60: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
0f70: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
0f80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
0f90: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
0fa0: 2e 20 20 4b 6e 75 74 68 20 73 61 79 73 20 74 68  .  Knuth says th
0fb0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70  is should be a p
0fc0: 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  rime number..*/.
0fd0: 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53  #define N_PG_HAS
0fe0: 48 20 32 30 30 33 0a 0a 2f 2a 0a 2a 2a 20 41 20  H 2003../*.** A 
0ff0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
1000: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1010: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1020: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1030: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63  ruct Pager {.  c
1040: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1060: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1070: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
1080: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10b0: 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  file */.  OsFile
10c0: 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20   fd, jfd;       
10d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
10e0: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
10f0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1100: 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 63  al */.  OsFile c
1110: 70 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  pfd;            
1120: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1130: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 63  riptor for the c
1140: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
1150: 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  l */.  int dbSiz
1160: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1180: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1190: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
11a0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
11b0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
11c0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
11d0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
11e0: 63 6b 70 74 53 69 7a 65 2c 20 63 6b 70 74 4a 53  ckptSize, ckptJS
11f0: 69 7a 65 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20  ize;    /* Size 
1200: 6f 66 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  of database and 
1210: 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b 70 74 5f  journal at ckpt_
1220: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
1230: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
1240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1250: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1260: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1270: 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64  y page */.  void
1280: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
1290: 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  void*); /* Call 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
12b0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
12c0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
12f0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
1300: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
1310: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1320: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1330: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
1340: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
1350: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
1360: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1370: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1380: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1390: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
13a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
13b0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
13c0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
13d0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
13e0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
13f0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1410: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
1420: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1430: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
1440: 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20  8 ckptOpen;     
1450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1460: 75 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 70  ue if the checkp
1470: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  oint journal is 
1480: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70  open */.  u8 ckp
1490: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
14a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
14b0: 20 61 72 65 20 69 6e 20 61 20 63 68 65 63 6b 70   are in a checkp
14c0: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  oint */.  u8 noS
14d0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
14e0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
14f0: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1500: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
1510: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
1520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
1530: 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41  ITE_UNLOCK, _REA
1540: 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c  DLOCK or _WRITEL
1550: 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d  OCK */.  u8 errM
1560: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1570: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
1580: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
1590: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74  errors */.  u8 t
15a0: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
15c0: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
15d0: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
15e0: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1600: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
1610: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1620: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
1630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1640: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
1650: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
1660: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1670: 75 38 20 64 69 72 74 79 46 69 6c 65 3b 20 20 20  u8 dirtyFile;   
1680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1690: 72 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20  rue if database 
16a0: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
16b0: 20 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a 20   in any way */. 
16c0: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
16d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
16e0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
16f0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
1700: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6a 6f  pages */.  u8 jo
1710: 75 72 6e 61 6c 46 6f 72 6d 61 74 3b 20 20 20 20  urnalFormat;    
1720: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 73 69 6f         /* Versio
1730: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  n number of the 
1740: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
1750: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1770: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
1780: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
1790: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
17a0: 20 75 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20 20   u8 *aInCkpt;   
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
17d0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
17e0: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72  abase */.  PgHdr
17f0: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
1800: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1810: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
1820: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1840: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
1850: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61  es */.  PgHdr *a
1860: 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b  Hash[N_PG_HASH];
1870: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
1880: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
1890: 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f  mber of PgHdr */
18a0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .};../*.** These
18b0: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
18c0: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
18d0: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23  er.errMask..*/.#
18e0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
18f0: 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20  _FULL     0x01  
1900: 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69  /* a write() fai
1910: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
1920: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20  AGER_ERR_MEM    
1930: 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f    0x02  /* mallo
1940: 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  c() failed */.#d
1950: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
1960: 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f  LOCK     0x04  /
1970: 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c  * error in the l
1980: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
1990: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
19a0: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78  _ERR_CORRUPT  0x
19b0: 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  08  /* database 
19c0: 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  or journal corru
19d0: 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ption */.#define
19e0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
19f0: 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e      0x10  /* gen
1a00: 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72  eral disk I/O er
1a10: 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64  ror - bad hard d
1a20: 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rive? */../*.** 
1a30: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a40: 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72   contains page r
1a50: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f  ecords in the fo
1a60: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61  llowing.** forma
1a70: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1a80: 72 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20  ruct PageRecord 
1a90: 50 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75  PageRecord;.stru
1aa0: 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a  ct PageRecord {.
1ab0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
1ae0: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44  ber */.  char aD
1af0: 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ata[SQLITE_PAGE_
1b00: 53 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67 69  SIZE];  /* Origi
1b10: 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67  nal data for pag
1b20: 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e pgno */.};../*
1b30: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
1b40: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
1b60: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
1b70: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
1b80: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
1b90: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
1ba0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
1bb0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  y check..**.** T
1bc0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6a 6f 75  here are two jou
1bd0: 72 6e 61 6c 20 66 6f 72 6d 61 74 73 2e 20 20 54  rnal formats.  T
1be0: 68 65 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c  he older journal
1bf0: 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a 2a   format writes.*
1c00: 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  * 32-bit integer
1c10: 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f 72  s in the byte-or
1c20: 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74 20  der of the host 
1c30: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 6e 65  machine.  The ne
1c40: 77 0a 2a 2a 20 66 6f 72 6d 61 74 20 77 72 69 74  w.** format writ
1c50: 65 73 20 69 6e 74 65 67 65 72 73 20 61 73 20 62  es integers as b
1c60: 69 67 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20  ig-endian.  All 
1c70: 6e 65 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65  new journals use
1c80: 20 74 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d   the.** new form
1c90: 61 74 2c 20 62 75 74 20 77 65 20 68 61 76 65 20  at, but we have 
1ca0: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65  to be able to re
1cb0: 61 64 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72  ad an older jour
1cc0: 6e 61 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  nal in order.** 
1cd0: 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
1ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1cf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
1d00: 4f 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  OldJournalMagic[
1d10: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
1d20: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
1d30: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
1d40: 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69  , 0xd4,.};.stati
1d50: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1d60: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
1d70: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
1d80: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
1d90: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
1da0: 30 78 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 23  0x63, 0xd5,.};.#
1db0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4e 45  define SQLITE_NE
1dc0: 57 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  W_JOURNAL_FORMAT
1dd0: 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   1.#define SQLIT
1de0: 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f  E_OLD_JOURNAL_FO
1df0: 52 4d 41 54 20 30 0a 0a 2f 2a 0a 2a 2a 20 54 68  RMAT 0../*.** Th
1e00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65  e following inte
1e10: 67 65 72 2c 20 69 66 20 73 65 74 2c 20 63 61 75  ger, if set, cau
1e20: 73 65 73 20 6a 6f 75 72 6e 61 6c 73 20 74 6f 20  ses journals to 
1e30: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  be written in th
1e40: 65 0a 2a 2a 20 6f 6c 64 20 66 6f 72 6d 61 74 2e  e.** old format.
1e50: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
1e60: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
1e70: 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61  ses only - to ma
1e80: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 63  ke sure.** the c
1e90: 6f 64 65 20 69 73 20 61 62 6c 65 20 74 6f 20 72  ode is able to r
1ea0: 6f 6c 6c 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  ollback an old j
1eb0: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 23 69 66 64 65  ournal..*/.#ifde
1ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
1ed0: 74 20 70 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d  t pager_old_form
1ee0: 61 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 23 20  at = 0;.#else.# 
1ef0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 6f 6c 64  define pager_old
1f00: 5f 66 6f 72 6d 61 74 20 30 0a 23 65 6e 64 69 66  _format 0.#endif
1f10: 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70  ../*.** Hash a p
1f20: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64  age number.*/.#d
1f30: 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68  efine pager_hash
1f40: 28 50 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50 47  (PN)  ((PN)%N_PG
1f50: 5f 48 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e  _HASH)../*.** En
1f60: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
1f70: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65  ount tracking he
1f80: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
1f90: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
1fa0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e  pager_refinfo_en
1fb0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
1fc0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
1fd0: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
1fe0: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
1ff0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
2000: 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f   !pager_refinfo_
2010: 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  enable ) return;
2020: 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20  .    printf(.   
2030: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
2040: 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
2050: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
2060: 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  p->pgno, (int)PG
2070: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
2080: 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  p->nRef.    );. 
2090: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
20a0: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
20b0: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
20c0: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
20d0: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
20e0: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
20f0: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
2100: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  NFO(X).#endif../
2110: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
2120: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
2130: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
2140: 65 73 63 72 69 70 74 6f 72 0a 2a 2f 0a 73 74 61  escriptor.*/.sta
2150: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
2160: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
2170: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  , OsFile *fd, u3
2180: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
2190: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
21a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
21b0: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
21c0: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
21d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21e0: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21f0: 6c 46 6f 72 6d 61 74 3d 3d 53 51 4c 49 54 45 5f  lFormat==SQLITE_
2200: 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  NEW_JOURNAL_FORM
2210: 41 54 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  AT ){.    unsign
2220: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2230: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2240: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
2250: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
2260: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
2270: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
2280: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
2290: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
22a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
22b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
22c0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
22d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22e0: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
22f0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
2300: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
2310: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
2320: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
2330: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
2340: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
2350: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
2360: 3b 0a 20 20 69 66 28 20 70 61 67 65 72 5f 6f 6c  ;.  if( pager_ol
2370: 64 5f 66 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20  d_format ){.    
2380: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57  return sqliteOsW
2390: 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34  rite(fd, &val, 4
23a0: 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d  );.  }.  ac[0] =
23b0: 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66   (val>>24) & 0xf
23c0: 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  f;.  ac[1] = (va
23d0: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
23e0: 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38   ac[2] = (val>>8
23f0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33  ) & 0xff;.  ac[3
2400: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
2410: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f    return sqliteO
2420: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
2430: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  );.}.../*.** Con
2440: 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e  vert the bits in
2450: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
2460: 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70  Mask into an app
2470: 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72  roprate.** retur
2480: 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  n code..*/.stati
2490: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63  c int pager_errc
24a0: 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
24b0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
24c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
24d0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
24e0: 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  & PAGER_ERR_LOCK
24f0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
2500: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66  E_PROTOCOL;.  if
2510: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
2520: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49  k & PAGER_ERR_DI
2530: 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  SK )    rc = SQL
2540: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28  ITE_IOERR;.  if(
2550: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2560: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   & PAGER_ERR_FUL
2570: 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  L )    rc = SQLI
2580: 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70  TE_FULL;.  if( p
2590: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
25a0: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29   PAGER_ERR_MEM )
25b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50  _NOMEM;.  if( pP
25d0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
25e0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
25f0: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
2600: 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72  CORRUPT;.  retur
2610: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
2620: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
2630: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
2640: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
2650: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
2660: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2670: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
2680: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
2690: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
26a0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
26b0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
26c0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
26d0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
26e0: 67 6e 6f 20 25 20 4e 5f 50 47 5f 48 41 53 48 5d  gno % N_PG_HASH]
26f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
2700: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
2710: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
2720: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
2730: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2740: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
2750: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
2760: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2770: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2780: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
2790: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
27a0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
27b0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
27c0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
27d0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
27e0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
27f0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
2800: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
2810: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
2820: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
2830: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
2840: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
2850: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
2860: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
2870: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
2880: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Pg, *pNext;.  fo
2890: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
28a0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
28b0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
28c0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
28d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
28e0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
28f0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
2900: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2910: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
2920: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
2930: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2940: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2950: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
2960: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
2970: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2980: 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate>=SQLITE_WRIT
2990: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c  ELOCK ){.    sql
29a0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
29b0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
29c0: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
29d0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
29e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
29f0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
2a00: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2a10: 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = -1;.  pPager->
2a20: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65  nRef = 0;.  asse
2a30: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2a40: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a  nalOpen==0 );.}.
2a50: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
2a60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a70: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
2a80: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
2a90: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
2aa0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
2ab0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2ac0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61  is routine relea
2ad0: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
2ae0: 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 61  .** write lock a
2af0: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 72 65  nd acquires a re
2b00: 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ad lock in its p
2b10: 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e  lace.  The journ
2b20: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 64 65  al file.** is de
2b30: 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  leted and closed
2b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b50: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
2b60: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
2b70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
2b80: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28 20  Hdr *pPg;.  if( 
2b90: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 53 51  pPager->state<SQ
2ba0: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
2bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bc0: 4b 3b 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72  K;.  sqlitepager
2bd0: 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _ckpt_commit(pPa
2be0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
2bf0: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a  er->ckptOpen ){.
2c00: 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73      sqliteOsClos
2c10: 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29  e(&pPager->cpfd)
2c20: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2c30: 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  ptOpen = 0;.  }.
2c40: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
2c50: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
2c60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c70: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Open = 0;.  sqli
2c80: 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  teOsDelete(pPage
2c90: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
2ca0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61  rc = sqliteOsRea
2cb0: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
2cc0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  d);.  sqliteFree
2cd0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
2ce0: 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72  rnal );.  pPager
2cf0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
2d00: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
2d10: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
2d20: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
2d30: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  ){.    pPg->inJo
2d40: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70  urnal = 0;.    p
2d50: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
2d60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2d70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2d80: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
2d90: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
2da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2db0: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
2dc0: 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65 73 73  pen if a process
2dd0: 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c 20 74   does a BEGIN, t
2de0: 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20 74 68  hen forks and th
2df0: 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
2e00: 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68 65 20  rocess does the 
2e10: 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75 73 65  COMMIT.  Because
2e20: 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74 69 63   of the semantic
2e30: 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a  s of unix.    **
2e40: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74   file locking, t
2e50: 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66  he unlock will f
2e60: 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ail..    */.    
2e70: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2e80: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20  SQLITE_UNLOCK;. 
2e90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
2eb0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
2ec0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ed0: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
2ee0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
2ef0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
2f00: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  is one page..*/.
2f10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2f20: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
2f30: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
2f40: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 29 7b 0a  , OsFile *jfd){.
2f50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
2f60: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
2f70: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
2f80: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
2f90: 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52  cache */.  PageR
2fa0: 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 0a 20 20  ecord pgRec;..  
2fb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
2fc0: 70 50 61 67 65 72 2c 20 6a 66 64 2c 20 26 70 67  pPager, jfd, &pg
2fd0: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Rec.pgno);.  if(
2fe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
3000: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
3010: 6a 66 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74  jfd, &pgRec.aDat
3020: 61 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e  a, sizeof(pgRec.
3030: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72  aData));.  if( r
3040: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3050: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
3060: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
3070: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
3080: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e   if( pgRec.pgno>
3090: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
30a0: 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20  | pgRec.pgno==0 
30b0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30c0: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20 50  CORRUPT;..  /* P
30d0: 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61 67 65  layback the page
30e0: 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  .  Update the in
30f0: 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20  -memory copy of 
3100: 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74  the page.  ** at
3110: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
3120: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
3130: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
3140: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
3150: 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  r, pgRec.pgno);.
3160: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
3170: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
3180: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67 52 65  _DATA(pPg), pgRe
3190: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
31a0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
31b0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
31c0: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
31d0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
31e0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
31f0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
3200: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
3210: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
3220: 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72 63 3d  SIZE);.  if( rc=
3230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
3250: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
3260: 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53  , pgRec.aData, S
3270: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
3280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
32a0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
32b0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
32c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
32d0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
32e0: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
32f0: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
3300: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
3310: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
3320: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
3330: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20  is as follows:  
3340: 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e 69 74  There is an init
3350: 69 61 6c 0a 2a 2a 20 66 69 6c 65 2d 74 79 70 65  ial.** file-type
3360: 20 73 74 72 69 6e 67 20 66 6f 72 20 73 61 6e 69   string for sani
3370: 74 79 20 63 68 65 63 6b 69 6e 67 2e 20 20 54 68  ty checking.  Th
3380: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 73 69  en there is a si
3390: 6e 67 6c 65 0a 2a 2a 20 50 67 6e 6f 20 6e 75 6d  ngle.** Pgno num
33a0: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
33b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
33c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
33d0: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 68 61 6e 67   before.** chang
33e0: 65 73 20 77 65 72 65 20 6d 61 64 65 2e 20 20 54  es were made.  T
33f0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
3400: 72 75 6e 63 61 74 65 64 20 74 6f 20 74 68 69 73  runcated to this
3410: 20 73 69 7a 65 2e 0a 2a 2a 20 4e 65 78 74 20 63   size..** Next c
3420: 6f 6d 65 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ome zero or more
3430: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 77 68   page records wh
3440: 65 72 65 20 65 61 63 68 20 70 61 67 65 20 72 65  ere each page re
3450: 63 6f 72 64 0a 2a 2a 20 63 6f 6e 73 69 73 74 73  cord.** consists
3460: 20 6f 66 20 61 20 50 67 6e 6f 20 61 6e 64 20 53   of a Pgno and S
3470: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
3480: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 20  bytes of data.  
3490: 53 65 65 0a 2a 2a 20 74 68 65 20 50 61 67 65 52  See.** the PageR
34a0: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
34b0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
34c0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
34d0: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
34e0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
34f0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
3500: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  * journal file (
3510: 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
3520: 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20   looking at the 
3530: 6d 61 67 69 63 20 6e 75 6d 62 65 72 0a 2a 2a 20  magic number.** 
3540: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
3550: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
3560: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
3570: 54 45 5f 50 52 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20  TE_PROTOCOL..** 
3580: 49 66 20 61 6e 79 20 6f 74 68 65 72 20 65 72 72  If any other err
3590: 6f 72 73 20 6f 63 63 75 72 20 64 75 72 69 6e 67  ors occur during
35a0: 20 70 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 64   playback, the d
35b0: 61 74 61 62 61 73 65 20 77 69 6c 6c 0a 2a 2a 20  atabase will.** 
35c0: 6c 69 6b 65 6c 79 20 62 65 20 63 6f 72 72 75 70  likely be corrup
35d0: 74 65 64 2c 20 73 6f 20 74 68 65 20 50 41 47 45  ted, so the PAGE
35e0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 62 69  R_ERR_CORRUPT bi
35f0: 74 20 69 73 20 73 65 74 20 69 6e 0a 2a 2a 20 70  t is set in.** p
3600: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 61  Pager->errMask a
3610: 6e 64 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  nd SQLITE_CORRUP
3620: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  T is returned.  
3630: 49 66 20 69 74 20 61 6c 6c 0a 2a 2a 20 77 6f 72  If it all.** wor
3640: 6b 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ks, then this ro
3650: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
3660: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
3670: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
3680: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
3690: 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65 63  ger){.  int nRec
36a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
36c0: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
36d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
36f0: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
3700: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
3710: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
3720: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
3730: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73  n pages */.  uns
3740: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
3750: 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  c[sizeof(aJourna
3760: 6c 4d 61 67 69 63 29 5d 3b 0a 20 20 69 6e 74 20  lMagic)];.  int 
3770: 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  rc;..  /* Figure
3780: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
3790: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
37a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
37b0: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
37c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
37d0: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
37e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
37f0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
3800: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
3810: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63  r->jfd, 0);.  rc
3820: 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53   = sqliteOsFileS
3830: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
3840: 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20  , &nRec);.  if( 
3850: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3860: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
3870: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52  ayback;.  }.  nR
3880: 65 63 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69  ec = (nRec - (si
3890: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a  zeof(aMagic)+siz
38a0: 65 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69  eof(Pgno))) / si
38b0: 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29  zeof(PageRecord)
38c0: 3b 0a 20 20 69 66 28 20 6e 52 65 63 3c 3d 30 20  ;.  if( nRec<=0 
38d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
38e0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
38f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67   /* Read the beg
3900: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  inning of the jo
3910: 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61  urnal and trunca
3920: 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  te the.  ** data
3930: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
3940: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
3950: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
3960: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70   sqliteOsRead(&p
3970: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
3980: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
3990: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  c));.  if( rc!=S
39a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
39b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
39c0: 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OCOL;.    goto e
39d0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
39e0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
39f0: 61 67 69 63 2c 20 61 4f 6c 64 4a 6f 75 72 6e 61  agic, aOldJourna
3a00: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
3a10: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
3a20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
3a30: 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49 54 45  lFormat = SQLITE
3a40: 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52  _OLD_JOURNAL_FOR
3a50: 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  MAT;.  }else if(
3a60: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
3a70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
3a80: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d  izeof(aMagic))==
3a90: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
3aa0: 3e 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d  >journalFormat =
3ab0: 20 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52   SQLITE_NEW_JOUR
3ac0: 4e 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65  NAL_FORMAT;.  }e
3ad0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
3ae0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
3af0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
3b00: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  back;.  }.  rc =
3b10: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
3b20: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
3b30: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20  , &mxPg);.  if( 
3b40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3b50: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
3b60: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  ayback;.  }.  rc
3b70: 20 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63   = sqliteOsTrunc
3b80: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
3b90: 20 6d 78 50 67 2a 53 51 4c 49 54 45 5f 50 41 47   mxPg*SQLITE_PAG
3ba0: 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72  E_SIZE);.  if( r
3bb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3bc0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
3bd0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
3be0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
3bf0: 50 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  Pg;.  .  /* Copy
3c00: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
3c10: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
3c20: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
3c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3c40: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
3c50: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
3c60: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
3c70: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
3c80: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
3c90: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
3ca0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3cb0: 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  OK ) break;.  }.
3cc0: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
3cd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3ce0: 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
3cf0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
3d00: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
3d10: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
3d20: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
3d30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
3d40: 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
3d50: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
3d60: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
3d70: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
3d80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3d90: 6c 61 79 62 61 63 6b 20 74 68 65 20 63 68 65 63  layback the chec
3da0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
3db0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
3dc0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
3dd0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
3de0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
3df0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
3e00: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
3e10: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
3e20: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
3e30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3e40: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
3e50: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
3e60: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
3e70: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
3e80: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e 6f  er->ckptSize, no
3e90: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
3ea0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
3eb0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
3ec0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
3ed0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
3ee0: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
3ef0: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
3f00: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
3f10: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
3f20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3f30: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
3f40: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
3f50: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
3f60: 63 6b 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  ckptJSize..*/.st
3f70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 63  atic int pager_c
3f80: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  kpt_playback(Pag
3f90: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3fa0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fc0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
3fd0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
3fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3ff0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
4000: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72  int rc;..  /* Tr
4010: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
4020: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
4030: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
4040: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
4050: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
4060: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
4070: 3e 63 6b 70 74 53 69 7a 65 2a 53 51 4c 49 54 45  >ckptSize*SQLITE
4080: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 70  _PAGE_SIZE);.  p
4090: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
40a0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
40b0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
40c0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
40d0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  rds are in the c
40e0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
40f0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
4100: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
4110: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
4120: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
4130: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
4140: 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a  ager->cpfd, 0);.
4150: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
4160: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
4170: 3e 63 70 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20  >cpfd, &nRec);. 
4180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4190: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
41a0: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
41b0: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 2f 3d 20  ;.  }.  nRec /= 
41c0: 73 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72  sizeof(PageRecor
41d0: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  d);.  .  /* Copy
41e0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
41f0: 6f 75 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b  out of the check
4200: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  point journal an
4210: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
4220: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
4230: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
4240: 61 67 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20  ager_old_format 
4250: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
4260: 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53  ournalFormat = S
4270: 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41  QLITE_OLD_JOURNA
4280: 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73  L_FORMAT;.  }els
4290: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
42a0: 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53  ournalFormat = S
42b0: 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41  QLITE_NEW_JOURNA
42c0: 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20 20  L_FORMAT;.  }.  
42d0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
42e0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
42f0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
4300: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
4310: 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64  r, &pPager->cpfd
4320: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
4330: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
4340: 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63  end_ckpt_playbac
4350: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  k;.  }..  /* Fig
4360: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
4370: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
4380: 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  e copied out of 
4390: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
43a0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20    ** journal..  
43b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
43c0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
43d0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  jfd, pPager->ckp
43e0: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
43f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4400: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70      goto end_ckp
4410: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
4420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
4430: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
4440: 3e 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20  >jfd, &nRec);.  
4450: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4460: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
4470: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
4480: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e  .  }.  nRec = (n
4490: 52 65 63 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b  Rec - pPager->ck
44a0: 70 74 4a 53 69 7a 65 29 2f 73 69 7a 65 6f 66 28  ptJSize)/sizeof(
44b0: 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 66  PageRecord);.  f
44c0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
44d0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
44e0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
44f0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
4500: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
4510: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
4520: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
4530: 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b  d_ckpt_playback;
4540: 0a 20 20 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b 70  .  }.  ..end_ckp
4550: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
4560: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4570: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
4580: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
4590: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
45a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
45b0: 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RUPT;.  }.  retu
45c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
45d0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
45e0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
45f0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
4600: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
4610: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4620: 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61   number is the a
4630: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
4640: 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61   the mxPage para
4650: 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50  meter..** If mxP
4660: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
4670: 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67   the noSync flag
4680: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e   is also set.  n
4690: 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a  oSync bypasses.*
46a0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
46b0: 65 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  eOsSync().  The 
46c0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
46d0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
46e0: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
46f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
4700: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
4710: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
4720: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
4730: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
4740: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
4750: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
4760: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
4770: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
4780: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
4790: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63  qlitepager_set_c
47a0: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
47b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
47c0: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
47d0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
47e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
47f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
4800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
4810: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
4820: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
4830: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
4840: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
4850: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
4860: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a  = mxPage;.  }.}.
4870: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
4880: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
4890: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
48a0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
48b0: 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d  Name.** (zName m
48c0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
48d0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
48e0: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
48f0: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
4900: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4910: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
4920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4930: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
4940: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
4950: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
4960: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
4970: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
4980: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
4990: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
49a0: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
49b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
49c0: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  itepager_opentem
49d0: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
49e0: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
49f0: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
4a00: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
4a10: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
4a20: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
4a30: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
4a40: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
4a50: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c  usive(zFile, fd,
4a60: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
4a70: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
4a80: 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
4a90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
4aa0: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
4ab0: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
4ac0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4ad0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
4ae0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
4af0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
4b00: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
4b10: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
4b20: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
4b30: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
4b40: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
4b50: 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  get() and is onl
4b60: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
4b70: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
4b80: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
4b90: 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65 72  sing sqlitepager
4ba0: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
4bb0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
4bc0: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
4bd0: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
4be0: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
4bf0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
4c00: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
4c10: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
4c20: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
4c30: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
4c40: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
4c50: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
4c60: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
4c70: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
4c80: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
4c90: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
4ca0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
4cb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4cc0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
4cd0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
4ce0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
4cf0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  en */.  int mxPa
4d00: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
4d10: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
4d20: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  f in-memory cach
4d30: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  e pages */.  int
4d40: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4d50: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
4d60: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
4d70: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4d80: 67 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  ge */.){.  Pager
4d90: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
4da0: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
4db0: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  e fd;.  int rc;.
4dc0: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a    int tempFile;.
4dd0: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
4de0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70   0;.  char zTemp
4df0: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
4e00: 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61  _SIZE];..  *ppPa
4e10: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
4e20: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
4e30: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
4e40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4e50: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
4e60: 61 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ame ){.    rc = 
4e70: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64  sqliteOsOpenRead
4e80: 57 72 69 74 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  Write(zFilename,
4e90: 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29   &fd, &readOnly)
4ea0: 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  ;.    tempFile =
4eb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
4ec0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
4ed0: 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
4ee0: 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c  , &fd);.    zFil
4ef0: 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20  ename = zTemp;. 
4f00: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
4f10: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
4f20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4f40: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61  NTOPEN;.  }.  na
4f50: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
4f60: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Filename);.  pPa
4f70: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
4f80: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
4f90: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20  er) + nameLen*2 
4fa0: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
4fb0: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
4fc0: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64  qliteOsClose(&fd
4fd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
4fe0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4ff0: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
5000: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
5010: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
5020: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
5030: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
5040: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
5050: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
5060: 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  ilename, zFilena
5070: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
5080: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
5090: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74  zFilename);.  st
50a0: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
50b0: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
50c0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
50d0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
50e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
50f0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  alOpen = 0;.  pP
5100: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d  ager->ckptOpen =
5110: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b   0;.  pPager->ck
5120: 70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70  ptInUse = 0;.  p
5130: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
5140: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
5150: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
5160: 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 30 3b 0a  ->ckptSize = 0;.
5170: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53    pPager->ckptJS
5180: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
5190: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
51a0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
51b0: 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61   mxPage>5 ? mxPa
51c0: 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65  ge : 10;.  pPage
51d0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
51e0: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
51f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
5200: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
5210: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
5220: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
5230: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
5240: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
5250: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
5260: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
5270: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
5280: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
5290: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
52a0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
52b0: 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61  >nExtra = nExtra
52c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
52d0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
52e0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
52f0: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
5300: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
5310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5320: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
5330: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
5340: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
5350: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74  t NULL, the dest
5360: 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64  ructor is called
5370: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66  .** when the ref
5380: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
5390: 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65  each page reache
53a0: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73  s zero.  The des
53b0: 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62  tructor can.** b
53c0: 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  e used to clean 
53d0: 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  up information i
53e0: 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d  n the extra segm
53f0: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
5400: 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  each page..**.**
5410: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
5420: 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73  is not called as
5430: 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65   a result sqlite
5440: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
5450: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
5460: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
5470: 62 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  by sqlitepager_u
5480: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
5490: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f  sqlitepager_set_
54a0: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
54b0: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
54c0: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29 7b  *xDesc)(void*)){
54d0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
54e0: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
54f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5500: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
5510: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
5520: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
5530: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
5540: 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
5550: 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75  itepager_pagecou
5560: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
5570: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
5580: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
5590: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
55a0: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
55b0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
55c0: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  >dbSize;.  }.  i
55d0: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53  f( sqliteOsFileS
55e0: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
55f0: 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   &n)!=SQLITE_OK 
5600: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
5610: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
5620: 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65  ERR_DISK;.    re
5630: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  turn 0;.  }.  n 
5640: 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  /= SQLITE_PAGE_S
5650: 49 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65  IZE;.  if( pPage
5660: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
5670: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _UNLOCK ){.    p
5680: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
5690: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
56a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  n;.}../*.** Shut
56b0: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
56c0: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
56d0: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
56e0: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
56f0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
5700: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
5710: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
5720: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
5730: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
5740: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
5750: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
5760: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
5770: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
5780: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
5790: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
57a0: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
57b0: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
57c0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
57d0: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
57e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
57f0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
5800: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
5810: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
5820: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
5830: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5840: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
5850: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
5860: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
5870: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5880: 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20  _WRITELOCK: {.  
5890: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
58a0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
58b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
58c0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
58d0: 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
58e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
58f0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
5900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5910: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5920: 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  READLOCK: {.    
5930: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
5940: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
5950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5960: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
5970: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
5980: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
5990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
59a0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
59b0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
59c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
59d0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
59e0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
59f0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71  e(pPg);.  }.  sq
5a00: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61  liteOsClose(&pPa
5a10: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
5a20: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
5a30: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
5a40: 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
5a50: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
5a60: 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
5a70: 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
5a80: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
5a90: 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44 65   **   sqliteOsDe
5aa0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
5ab0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
5ac0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
5ad0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
5ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5af0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5b00: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
5b10: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
5b20: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
5b30: 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65  sqlitepager_page
5b40: 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61  number(void *pDa
5b50: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  ta){.  PgHdr *p 
5b60: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
5b70: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
5b80: 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
5b90: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
5ba0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5bb0: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
5bc0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
5bd0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
5be0: 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
5bf0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
5c00: 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
5c10: 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
5c20: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
5c30: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5c40: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
5c50: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
5c60: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
5c70: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
5c80: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
5c90: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
5ca0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
5cb0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
5cc0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
5cd0: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
5ce0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
5cf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5d00: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
5d10: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
5d20: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
5d30: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
5d40: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
5d50: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
5d60: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
5d70: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
5d80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
5d90: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
5da0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
5db0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
5dc0: 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
5dd0: 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
5de0: 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
5df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
5e00: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
5e10: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
5e20: 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
5e30: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
5e40: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
5e50: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
5e60: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  nt sqlitepager_r
5e70: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
5e80: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
5e90: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
5ea0: 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
5eb0: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
5ec0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5ed0: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
5ee0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20 77 72  rnal and then wr
5ef0: 69 74 65 20 61 6c 6c 20 66 72 65 65 20 64 69 72  ite all free dir
5f00: 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
5f10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5f20: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20  ..**.** Writing 
5f30: 61 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70  all free dirty p
5f40: 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
5f50: 62 61 73 65 20 61 66 74 65 72 20 74 68 65 20 73  base after the s
5f60: 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d  ync is a.** non-
5f70: 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  obvious optimiza
5f80: 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20 69  tion.  fsync() i
5f90: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
5fa0: 70 65 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a  peration so we.*
5fb0: 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69  * want to minimi
5fc0: 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 74  ze the number ot
5fd0: 20 74 69 6d 65 73 20 69 74 20 69 73 20 63 61 6c   times it is cal
5fe0: 6c 65 64 2e 20 41 66 74 65 72 20 61 6e 20 66 73  led. After an fs
5ff0: 79 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77  ync() call,.** w
6000: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 77 72  e are free to wr
6010: 69 74 65 20 64 69 72 74 79 20 70 61 67 65 73 20  ite dirty pages 
6020: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
6030: 62 61 73 65 2e 20 20 49 74 20 69 73 20 62 65 73  base.  It is bes
6040: 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  t.** to go ahead
6050: 20 61 6e 64 20 77 72 69 74 65 20 61 73 20 6d 61   and write as ma
6060: 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ny dirty pages a
6070: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69  s possible to mi
6080: 6e 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65 20 72  nimize .** the r
6090: 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f  isk of having to
60a0: 20 64 6f 20 61 6e 6f 74 68 65 72 20 66 73 79 6e   do another fsyn
60b0: 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57  c() later on.  W
60c0: 72 69 74 69 6e 67 20 64 69 72 74 79 0a 2a 2a 20  riting dirty.** 
60d0: 66 72 65 65 20 70 61 67 65 73 20 69 6e 20 74 68  free pages in th
60e0: 69 73 20 77 61 79 20 77 61 73 20 6f 62 73 65 72  is way was obser
60f0: 76 65 64 20 74 6f 20 6d 61 6b 65 20 64 61 74 61  ved to make data
6100: 62 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  base operations 
6110: 67 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30 20 74  go.** up to 10 t
6120: 69 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  imes faster..**.
6130: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 77 72 69  ** If we are wri
6140: 74 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72 61 72  ting to temporar
6150: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 72  y database, ther
6160: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6170: 70 72 65 73 65 72 76 65 0a 2a 2a 20 74 68 65 20  preserve.** the 
6180: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
6190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
61a0: 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 74 69  o we can save ti
61b0: 6d 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 0a  me and skip the.
61c0: 2a 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73  ** fsync()..*/.s
61d0: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41 6c  tatic int syncAl
61e0: 6c 50 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  lPages(Pager *pP
61f0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
6200: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
6210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
6220: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
6230: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
6240: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
6250: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6260: 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65  iteOsSync(&pPage
6270: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
6280: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
6290: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
62a0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
62b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 0;.  }.  for(
62c0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  pPg=pPager->pFir
62d0: 73 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  st; pPg; pPg=pPg
62e0: 2d 3e 70 4e 65 78 74 46 72 65 65 29 7b 0a 20 20  ->pNextFree){.  
62f0: 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
6300: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6310: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
6320: 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  fd, (pPg->pgno-1
6330: 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  )*SQLITE_PAGE_SI
6340: 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ZE);.      rc = 
6350: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
6360: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
6370: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
6380: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6390: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
63a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
63b0: 6b 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  k;.      pPg->di
63c0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rty = 0;.    }. 
63d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
63e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
63f0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
6400: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
6410: 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
6420: 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
6430: 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
6440: 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
6450: 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
6460: 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
6470: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
6480: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
6490: 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
64a0: 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
64b0: 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
64c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
64d0: 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
64e0: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
64f0: 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
6500: 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
6510: 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
6520: 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
6530: 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
6540: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
6550: 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
6560: 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
6570: 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
6580: 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
6590: 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
65a0: 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
65b0: 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
65c0: 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
65d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
65e0: 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
65f0: 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
6600: 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
6610: 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
6620: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
6630: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
6640: 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
6650: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
6660: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
6670: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
6680: 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
6690: 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
66a0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
66b0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
66c0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
66d0: 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
66e0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
66f0: 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
6700: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
6710: 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
6720: 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
6730: 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
6740: 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
6750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
6760: 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
6770: 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
6780: 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
6790: 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
67a0: 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
67b0: 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
67c0: 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
67d0: 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
67e0: 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
67f0: 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
6800: 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
6810: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
6820: 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
6830: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  nt sqlitepager_g
6840: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
6850: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
6860: 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50  d **ppPage){.  P
6870: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
6880: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
6890: 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
68a0: 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
68b0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67    */ .  if( pPag
68c0: 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30  er==0 || pgno==0
68d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
68e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
68f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
6900: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
6910: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
6920: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
6930: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
6940: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
6950: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
6960: 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
6970: 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f  en get a read lo
6980: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
6990: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
69a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
69b0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
69c0: 69 66 28 20 73 71 6c 69 74 65 4f 73 52 65 61 64  if( sqliteOsRead
69d0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
69e0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
69f0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
6a00: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
6a10: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
6a20: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
6a30: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
6a40: 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20  ADLOCK;..    /* 
6a50: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
6a60: 65 20 65 78 69 73 74 73 2c 20 74 72 79 20 74 6f  e exists, try to
6a70: 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a 20   play it back.. 
6a80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
6a90: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
6aa0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
6ab0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  l) ){.       int
6ac0: 20 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20 20   rc, dummy;..   
6ad0: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69      /* Get a wri
6ae0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
6af0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 2a  atabase.       *
6b00: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
6b10: 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28  liteOsWriteLock(
6b20: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
6b30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6b40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6b50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
6b60: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
6b70: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73  fd);.         as
6b80: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
6b90: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
6ba0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
6bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6bc0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
6bd0: 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72   }.       pPager
6be0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
6bf0: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20  _WRITELOCK;..   
6c00: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
6c10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c  journal for excl
6c20: 75 73 69 76 65 20 61 63 63 65 73 73 2e 20 20 52  usive access.  R
6c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
6c40: 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
6c50: 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78 63  e cannot get exc
6c60: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f  lusive access to
6c70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6c80: 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
6c90: 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 74 68 6f       ** Even tho
6ca0: 75 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e 6c 79  ugh we will only
6cb0: 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
6cc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f   the journal, no
6cd0: 74 20 77 72 69 74 69 6e 67 2c 0a 20 20 20 20 20  t writing,.     
6ce0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
6cf0: 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
6d00: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 6e 20   for writing in 
6d10: 6f 72 64 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  order to obtain 
6d20: 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65 78 63  an.       ** exc
6d30: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6c 6f  lusive access lo
6d40: 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
6d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6d60: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
6d70: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
6d80: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
6d90: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
6da0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6db0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 63  K ){.         rc
6dc0: 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63   = sqliteOsUnloc
6dd0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
6de0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
6df0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6e00: 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  ;.         *ppPa
6e10: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
6e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
6e30: 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
6e40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
6e50: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 0a 20  rnalOpen = 1;.. 
6e60: 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
6e70: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
6e80: 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
6e90: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
6ea0: 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
6eb0: 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
6ec0: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
6ed0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6ee0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
6ef0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
6f00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6f10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6f30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6f40: 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
6f50: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
6f60: 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
6f70: 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
6f80: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
6f90: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
6fa0: 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
6fb0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
6fc0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
6fd0: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
6fe0: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b  e. */.    int h;
6ff0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69  .    pPager->nMi
7000: 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ss++;.    if( pP
7010: 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
7020: 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50  er->mxPage || pP
7030: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
7040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
7050: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
7060: 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
7070: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
7080: 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45  f(*pPg) + SQLITE
7090: 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 70 50 61  _PAGE_SIZE + pPa
70a0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20  ger->nExtra );. 
70b0: 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
70c0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  ){.        *ppPa
70d0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
70e0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
70f0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
7100: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
7110: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
7120: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
7130: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7150: 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
7160: 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d  ager;.      pPg-
7170: 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
7180: 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20  er->pAll;.      
7190: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
71a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
71b0: 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41  er->pAll->pPrevA
71c0: 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
71d0: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  }.      pPg->pPr
71e0: 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  evAll = 0;.     
71f0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
7200: 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
7210: 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
7220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7230: 52 65 63 79 63 6c 65 20 61 6e 20 6f 6c 64 65 72  Recycle an older
7240: 20 70 61 67 65 2e 20 20 46 69 72 73 74 20 6c 6f   page.  First lo
7250: 63 61 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  cate the page to
7260: 20 62 65 20 72 65 63 79 63 6c 65 64 2e 0a 20 20   be recycled..  
7270: 20 20 20 20 2a 2a 20 54 72 79 20 74 6f 20 66 69      ** Try to fi
7280: 6e 64 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  nd one that is n
7290: 6f 74 20 64 69 72 74 79 20 61 6e 64 20 69 73 20  ot dirty and is 
72a0: 6e 65 61 72 20 74 68 65 20 68 65 61 64 20 6f 66  near the head of
72b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
72c0: 20 66 72 65 65 20 6c 69 73 74 20 2a 2f 0a 20 20   free list */.  
72d0: 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
72e0: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
72f0: 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50  while( pPg && pP
7300: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
7310: 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
7320: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
7330: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77  }..      /* If w
7340: 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
7350: 20 61 20 70 61 67 65 20 74 68 61 74 20 68 61 73   a page that has
7360: 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 72   not been used r
7370: 65 63 65 6e 74 6c 79 0a 20 20 20 20 20 20 2a 2a  ecently.      **
7380: 20 61 6e 64 20 77 68 69 63 68 20 69 73 20 6e 6f   and which is no
7390: 74 20 64 69 72 74 79 2c 20 74 68 65 6e 20 73 79  t dirty, then sy
73a0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  nc the journal a
73b0: 6e 64 20 77 72 69 74 65 20 61 6c 6c 0a 20 20 20  nd write all.   
73c0: 20 20 20 2a 2a 20 64 69 72 74 79 20 66 72 65 65     ** dirty free
73d0: 20 70 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20   pages into the 
73e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
73f0: 68 75 73 20 6d 61 6b 69 6e 67 20 74 68 65 6d 0a  hus making them.
7400: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 70        ** clean p
7410: 61 67 65 73 20 61 6e 64 20 61 76 61 69 6c 61 62  ages and availab
7420: 6c 65 20 66 6f 72 20 72 65 63 79 63 6c 69 6e 67  le for recycling
7430: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
7440: 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 73   ** We have to s
7450: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7460: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  before writing a
7470: 20 70 61 67 65 20 74 6f 20 74 68 65 20 6d 61 69   page to the mai
7480: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  n.      ** datab
7490: 61 73 65 2e 20 20 42 75 74 20 73 79 6e 63 69 6e  ase.  But syncin
74a0: 67 20 69 73 20 61 20 76 65 72 79 20 73 6c 6f 77  g is a very slow
74b0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   operation.  So 
74c0: 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a  after a.      **
74d0: 20 73 79 6e 63 2c 20 69 74 20 69 73 20 62 65 73   sync, it is bes
74e0: 74 20 74 6f 20 77 72 69 74 65 20 65 76 65 72 79  t to write every
74f0: 74 68 69 6e 67 20 77 65 20 63 61 6e 20 62 61 63  thing we can bac
7500: 6b 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  k to the main.  
7510: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
7520: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
7530: 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74  risk of having t
7540: 6f 20 73 79 6e 63 20 61 67 61 69 6e 20 69 6e 20  o sync again in 
7550: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 61  the.      ** nea
7560: 72 20 66 75 74 75 72 65 2e 20 20 54 68 61 74 20  r future.  That 
7570: 69 73 20 77 68 79 20 77 65 20 77 72 69 74 65 20  is why we write 
7580: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
7590: 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a  after a.      **
75a0: 20 73 79 6e 63 2e 0a 20 20 20 20 20 20 2a 2f 0a   sync..      */.
75b0: 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
75c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
75d0: 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50 61 67 65  rc = syncAllPage
75e0: 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  s(pPager);.     
75f0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
7600: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7610: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
7620: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
7630: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
7640: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7650: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
7660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7670: 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
7680: 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  irst;.      }.  
7690: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
76a0: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
76b0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
76c0: 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
76d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
76e0: 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 79 69   we are recyclyi
76f0: 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
7700: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
7710: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65  then.      ** se
7720: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
7730: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
7740: 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
7750: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
7760: 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
7770: 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
7780: 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
7790: 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
77a0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  on..      ** It 
77b0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
77c0: 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
77d0: 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
77e0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
77f0: 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65       ** might be
7800: 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
7810: 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
7820: 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
7830: 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
7840: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77      ** that is w
7850: 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
7860: 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
7870: 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
7880: 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20  ages must.      
7890: 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
78a0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
78b0: 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
78c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
78d0: 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
78e0: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
78f0: 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
7900: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
7910: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
7920: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
7930: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
7940: 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
7950: 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20  hash table.     
7960: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
7970: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
7980: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72          pPg->pPr
7990: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
79a0: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
79b0: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
79c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
79d0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
79e0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
79f0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
7a00: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
7a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7a20: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
7a30: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
7a40: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
7a50: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
7a60: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  revFree;.      }
7a70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7a80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
7a90: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
7aa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
7ab0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
7ac0: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ee;.      }.    
7ad0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
7ae0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
7af0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
7b00: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
7b10: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
7b20: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
7b30: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
7b40: 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  vHash;.      }. 
7b50: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
7b60: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20  revHash ){.     
7b70: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
7b80: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
7b90: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
7ba0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7bb0: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
7bc0: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
7bd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7be0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
7bf0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
7c00: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
7c10: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
7c20: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
7c30: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
7c40: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
7c50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
7c60: 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20  er->nOvfl++;.   
7c70: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
7c80: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
7c90: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7ca0: 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
7cb0: 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
7cc0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
7cd0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
7ce0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7cf0: 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
7d00: 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
7d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d20: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
7d30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
7d40: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
7d50: 70 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  pt && (int)pgno<
7d60: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
7d70: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
7d80: 69 6e 43 6b 70 74 20 3d 20 28 70 50 61 67 65 72  inCkpt = (pPager
7d90: 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38  ->aInCkpt[pgno/8
7da0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
7db0: 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ))!=0;.    }else
7dc0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  {.      pPg->inC
7dd0: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  kpt = 0;.    }. 
7de0: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
7df0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
7e00: 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
7e10: 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
7e20: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
7e30: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
7e40: 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
7e50: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
7e60: 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
7e70: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
7e80: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
7e90: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
7ea0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
7eb0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
7ec0: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
7ed0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
7ee0: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
7ef0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
7f00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
7f10: 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 70  Size<0 ) sqlitep
7f20: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
7f30: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
7f40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
7f50: 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
7f60: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
7f70: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
7f80: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7f90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7fa0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
7fb0: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26    sqliteOsSeek(&
7fc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
7fd0: 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45  o-1)*SQLITE_PAGE
7fe0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
7ff0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
8000: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
8010: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8020: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
8030: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
8040: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8050: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
8060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8070: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8080: 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
8090: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
80a0: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
80b0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
80c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
80d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
80e0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
80f0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
8100: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
8110: 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
8120: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
8130: 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
8140: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
8150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8160: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
8170: 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
8180: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
8190: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
81a0: 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
81b0: 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
81c0: 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
81d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
81e0: 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
81f0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
8200: 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
8210: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
8220: 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  epager_get().  T
8230: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
8240: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
8250: 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
8260: 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
8270: 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
8280: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
8290: 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
82a0: 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
82b0: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
82c0: 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
82d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
82e0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
82f0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
8300: 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
8310: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
8320: 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
8330: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
8340: 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  itepager_lookup(
8350: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
8360: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
8370: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d  dr *pPg;..  /* M
8380: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
8390: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
83a0: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
83b0: 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  */ .  if( pPager
83c0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29  ==0 || pgno==0 )
83d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
83e0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
83f0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
8400: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
8410: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8420: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
8430: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8440: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8450: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
8460: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
8470: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
8480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
8490: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
84a0: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
84b0: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
84c0: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
84d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
84e0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
84f0: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
8500: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
8510: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
8520: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
8530: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
8540: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
8550: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
8560: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
8570: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
8580: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
8590: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
85a0: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
85b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
85c0: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
85d0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
85e0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
85f0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
8600: 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
8610: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
8620: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
8630: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
8640: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
8650: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
8660: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
8670: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
8680: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
8690: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
86a0: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
86b0: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
86c0: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
86d0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
86e0: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
86f0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
8700: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
8710: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
8720: 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
8730: 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
8740: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
8750: 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
8760: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
8770: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
8780: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
8790: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
87a0: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
87b0: 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
87c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
87d0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
87e0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
87f0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
8800: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
8810: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
8820: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
8830: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
8840: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
8850: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
8860: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
8870: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
8880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
8890: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
88a0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
88b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
88c0: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
88d0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
88e0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
88f0: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
8900: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8910: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8920: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
8930: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
8940: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
8950: 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
8960: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
8970: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8980: 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
8990: 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72    *  sqlitepager
89a0: 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c  _commit() is cal
89b0: 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
89c0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
89d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
89e0: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67  *   *  sqlitepag
89f0: 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61  er_close() is ca
8a00: 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
8a10: 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
8a20: 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
8a30: 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
8a40: 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
8a50: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  The parameter to
8a60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8a70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
8a80: 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
8a90: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
8aa0: 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
8ab0: 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
8ac0: 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
8ad0: 64 20 6d 65 72 65 6c 79 0a 2a 2a 20 74 6f 20 61  d merely.** to a
8ae0: 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
8af0: 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
8b00: 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
8b10: 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 0a  roof that there.
8b20: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  ** is already a 
8b30: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
8b40: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
8b50: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
8b60: 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74   is already writ
8b70: 65 2d 6c 6f 63 6b 65 64 2c 20 74 68 69 73 20 72  e-locked, this r
8b80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
8b90: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
8ba0: 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
8bb0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
8bc0: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
8bd0: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
8be0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
8bf0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
8c00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8c10: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
8c20: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
8c30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8c40: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c  tate!=SQLITE_UNL
8c50: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
8c60: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49  ger->state==SQLI
8c70: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b 0a 20  TE_READLOCK ){. 
8c80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8c90: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8ca0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
8cb0: 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28 26  iteOsWriteLock(&
8cc0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
8cd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8ce0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
8cf0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8d00: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
8d10: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
8d20: 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
8d30: 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20  ze/8 + 1 );.    
8d40: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
8d50: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
8d60: 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c     sqliteOsReadL
8d70: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
8d80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8d90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8da0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
8db0: 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  teOsOpenExclusiv
8dc0: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
8dd0: 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
8de0: 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
8df0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
8e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8e10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
8e20: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8e30: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8e40: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
8e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 52  .      sqliteOsR
8e60: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
8e70: 3e 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >fd);.      retu
8e80: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
8e90: 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  EN;.    }.    pP
8ea0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8eb0: 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
8ec0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
8ed0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
8ee0: 74 79 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  tyFile = 0;.    
8ef0: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
8f00: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
8f10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8f20: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
8f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65  ;.    sqlitepage
8f40: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
8f50: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
8f60: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
8f70: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
8f80: 20 20 69 66 28 20 70 61 67 65 72 5f 6f 6c 64 5f    if( pager_old_
8f90: 66 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20  format ){.      
8fa0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
8fb0: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
8fc0: 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67 69   aOldJournalMagi
8fd0: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
8ff0: 6f 66 28 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d 61  of(aOldJournalMa
9000: 67 69 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gic));.    }else
9010: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9020: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
9030: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
9040: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9050: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9060: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9070: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9080: 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
9090: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
90a0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
90b0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
90c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
90d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
90e0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
90f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
9100: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9110: 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
9120: 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
9130: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9140: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
9150: 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
9160: 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
9170: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9180: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
9190: 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
91a0: 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
91b0: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
91c0: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
91d0: 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
91e0: 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
91f0: 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
9200: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9210: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
9220: 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
9230: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
9240: 61 63 71 75 69 72 65 73 20 61 20 77 72 69 74 65  acquires a write
9250: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
9260: 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 77  abase.  If the w
9270: 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  rite.** lock cou
9280: 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
9290: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
92a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
92b0: 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
92c0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
92d0: 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
92e0: 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
92f0: 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
9300: 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
9310: 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
9320: 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
9330: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
9340: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
9350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
9360: 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
9370: 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
9380: 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
9390: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
93a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
93b0: 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
93c0: 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
93d0: 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
93e0: 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
93f0: 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
9400: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
9410: 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
9420: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
9430: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f  pager_commit() o
9440: 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  r sqlitepager_ro
9450: 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
9460: 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eset..*/.int sql
9470: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 76  itepager_write(v
9480: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
9490: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
94a0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
94b0: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
94c0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
94d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
94e0: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
94f0: 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
9500: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9510: 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
9520: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
9530: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
9540: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
9550: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
9560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
9570: 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ERM;.  }..  /* M
9580: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
9590: 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
95a0: 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
95b0: 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
95c0: 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
95d0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
95e0: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
95f0: 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74    */.  pPg->dirt
9600: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  y = 1;.  if( pPg
9610: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
9620: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70  pPg->inCkpt || p
9630: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
9640: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ==0) ){.    pPag
9650: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20  er->dirtyFile = 
9660: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
9670: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
9680: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
9690: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
96a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
96b0: 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77  eds to be.  ** w
96c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
96d0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
96e0: 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
96f0: 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  int journal.  **
9700: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
9710: 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
9720: 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
9730: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
9740: 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
9750: 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
9760: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
9770: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9780: 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
9790: 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72  TE_UNLOCK );.  r
97a0: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
97b0: 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20  begin(pData);.  
97c0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
97d0: 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 72 63 21  e = 1;.  if( rc!
97e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
97f0: 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
9800: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9810: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
9820: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9830: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9840: 65 6e 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en );..  /* The 
9850: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
9860: 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
9870: 6e 64 20 77 65 20 68 61 76 65 20 61 20 77 72 69  nd we have a wri
9880: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te lock on the. 
9890: 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73   ** main databas
98a0: 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
98b0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
98c0: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
98d0: 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  on .  ** journal
98e0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
98f0: 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
9900: 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
9910: 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
9920: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
9930: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
9940: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  ){.    rc = writ
9950: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
9960: 3e 6a 66 64 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  >jfd, pPg->pgno)
9970: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9980: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9990: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
99a0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
99b0: 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , pData, SQLITE_
99c0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
99d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
99e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
99f0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
9a00: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
9a10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
9a20: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
9a30: 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65  R_FULL;.      re
9a40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9a50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9a60: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
9a70: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
9a80: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
9a90: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
9aa0: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
9ab0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9ac0: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
9ad0: 79 6e 63 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  ync;.    pPg->in
9ae0: 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
9af0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
9b00: 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
9b10: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
9b20: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
9b30: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
9b40: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  ;.      pPg->inC
9b50: 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  kpt = 1;.    }. 
9b60: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
9b70: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
9b80: 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
9b90: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9ba0: 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  n it,.  ** then 
9bb0: 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
9bc0: 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 68  t page to the ch
9bd0: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
9be0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
9bf0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26  ger->ckptInUse &
9c00: 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26  & !pPg->inCkpt &
9c10: 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
9c20: 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  <=pPager->ckptSi
9c30: 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
9c40: 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
9c50: 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
9c60: 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
9c70: 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  bSize );.    rc 
9c80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
9c90: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 50 67  Pager->cpfd, pPg
9ca0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
9cb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9cc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9cd0: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
9ce0: 65 72 2d 3e 63 70 66 64 2c 20 70 44 61 74 61 2c  er->cpfd, pData,
9cf0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
9d00: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
9d10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9d20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70  ){.      sqlitep
9d30: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
9d40: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
9d50: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
9d60: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
9d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
9d80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
9d90: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  t( pPager->aInCk
9da0: 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  pt!=0 );.    pPa
9db0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
9dc0: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
9dd0: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
9de0: 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d     pPg->inCkpt =
9df0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70   1;.  }..  /* Up
9e00: 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
9e10: 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
9e20: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
9e30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
9e40: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
9e50: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
9e60: 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
9e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9e90: 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
9ea0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
9eb0: 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
9ec0: 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
9ed0: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77  to sqlitepager_w
9ee0: 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
9ef0: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
9f00: 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
9f10: 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
9f20: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
9f30: 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
9f40: 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74  litepager_iswrit
9f50: 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
9f60: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
9f70: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
9f80: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
9f90: 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
9fa0: 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
9fb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
9fc0: 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
9fd0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
9fe0: 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
9ff0: 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
a000: 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
a010: 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
a020: 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
a030: 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
a040: 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
a050: 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
a060: 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
a070: 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
a080: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
a090: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
a0a0: 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
a0b0: 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
a0c0: 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
a0d0: 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
a0e0: 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
a0f0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
a100: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
a110: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
a120: 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
a130: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
a140: 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
a150: 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f  qlitepager_dont_
a160: 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  rollback() below
a170: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
a180: 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
a190: 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
a1a0: 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
a1b0: 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
a1c0: 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
a1d0: 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
a1e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a1f0: 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
a200: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
a210: 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
a220: 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
a230: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
a240: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
a250: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
a260: 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
a270: 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
a280: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
a290: 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
a2a0: 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
a2b0: 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
a2c0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a2d0: 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
a2e0: 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
a2f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
a300: 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
a310: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
a320: 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
a330: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
a340: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
a350: 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
a360: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
a370: 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
a380: 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
a390: 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
a3a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a3b0: 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
a3c0: 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
a3d0: 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
a3e0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
a3f0: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
a400: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
a410: 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
a420: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
a430: 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
a440: 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
a450: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
a460: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
a470: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a480: 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
a490: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a4a0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
a4b0: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67  Hdr *pPg;..  pPg
a4c0: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
a4d0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
a4e0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
a4f0: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
a500: 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
a510: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
a520: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
a530: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
a540: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
a550: 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
a560: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
a570: 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
a580: 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
a590: 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
a5a0: 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
a5b0: 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
a5c0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
a5d0: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
a5e0: 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
a5f0: 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
a600: 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
a610: 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
a620: 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
a630: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
a640: 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
a650: 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
a660: 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
a670: 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
a680: 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
a690: 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
a6a0: 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
a6b0: 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
a6c0: 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
a6d0: 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
a6e0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
a6f0: 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
a700: 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
a710: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
a720: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
a730: 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
a740: 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
a750: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
a760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a770: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
a780: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a790: 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
a7a0: 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
a7b0: 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
a7c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
a7d0: 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
a7e0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
a7f0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
a800: 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
a810: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
a820: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
a830: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
a840: 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
a850: 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
a860: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
a870: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
a880: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  epager_dont_roll
a890: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
a8a0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
a8b0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
a8c0: 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
a8d0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
a8e0: 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
a8f0: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
a900: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c  ITE_WRITELOCK ||
a910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a920: 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
a930: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
a940: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
a950: 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
a960: 6c 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a  lback ) return;.
a970: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
a980: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
a990: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
a9a0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
a9b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a9c0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
a9d0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
a9e0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
a9f0: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
aa00: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
aa10: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
aa20: 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
aa30: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
aa40: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
aa50: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
aa60: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
aa70: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
aa80: 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20    pPg->inCkpt = 
aa90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
aaa0: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
aab0: 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
aac0: 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67  Ckpt && (int)pPg
aad0: 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
aae0: 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  ckptSize ){.    
aaf0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
ab00: 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
ab10: 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
ab20: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
ab30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ab40: 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b  r->aInCkpt!=0 );
ab50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
ab60: 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Ckpt[pPg->pgno/8
ab70: 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
ab80: 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
ab90: 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20 7d 0a  inCkpt = 1;.  }.
aba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
abb0: 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
abc0: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
abd0: 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
abe0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
abf0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
ac00: 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
ac10: 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
ac20: 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
ac30: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
ac40: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
ac50: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
ac60: 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
ac70: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
ac80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
ac90: 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
aca0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
acb0: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
acc0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
acd0: 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
ace0: 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
acf0: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
ad00: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
ad10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ad20: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
ad30: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
ad40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ad50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
ad60: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
ad70: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
ad80: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
ad90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
ada0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
adb0: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
adc0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
add0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ade0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
adf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
ae00: 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  en );.  if( pPag
ae10: 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30  er->dirtyFile==0
ae20: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
ae30: 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
ae40: 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
ae50: 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73  nsuming sqliteOs
ae60: 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
ae70: 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
ae80: 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
ae90: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
aea0: 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
aeb0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
aec0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
aed0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
aee0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
aef0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
af00: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
af10: 6e 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79  nc && sqliteOsSy
af20: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
af30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
af40: 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
af50: 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  bort;.  }.  for(
af60: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
af70: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
af80: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
af90: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
afa0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
afb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65   rc = sqliteOsSe
afc0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
afd0: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51  (pPg->pgno-1)*SQ
afe0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
aff0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b000: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
b010: 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20  mmit_abort;.    
b020: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
b030: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
b040: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b050: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
b060: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
b070: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b080: 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
b090: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
b0a0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73  ger->noSync && s
b0b0: 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61  qliteOsSync(&pPa
b0c0: 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45  ger->fd)!=SQLITE
b0d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
b0e0: 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
b0f0: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75  }.  rc = pager_u
b100: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
b110: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
b120: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
b130: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
b140: 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68  mp here if anyth
b150: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64  ing goes wrong d
b160: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
b170: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63   process..  */.c
b180: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72  ommit_abort:.  r
b190: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
b1a0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
b1b0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
b1c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
b1d0: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
b1e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
b200: 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
b210: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
b220: 6c 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64 2d  ls back to read-
b230: 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  only mode..** Al
b240: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
b250: 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
b260: 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
b270: 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
b280: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
b290: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
b2a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
b2b0: 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
b2c0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
b2d0: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
b2e0: 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
b2f0: 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
b300: 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
b310: 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
b320: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
b330: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
b340: 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
b350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
b360: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
b370: 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
b380: 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
b390: 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
b3a0: 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
b3b0: 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
b3c0: 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
b3d0: 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
b3e0: 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
b3f0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
b400: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
b410: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  nt sqlitepager_r
b420: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
b430: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
b440: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b450: 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
b460: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
b470: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
b480: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b490: 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57  >state>=SQLITE_W
b4a0: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
b4b0: 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
b4c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
b4d0: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
b4e0: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
b4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
b500: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
b510: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20  E_WRITELOCK ){. 
b520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b530: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
b540: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
b550: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
b560: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b570: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
b580: 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67  ORRUPT;.    pPag
b590: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
b5a0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
b5b0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
b5c0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
b5d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b5e0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
b5f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b600: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
b610: 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
b620: 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
b630: 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
b640: 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
b650: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
b660: 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79  pager_isreadonly
b670: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b680: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
b690: 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
b6a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b6b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
b6c0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
b6d0: 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
b6e0: 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61  *sqlitepager_sta
b6f0: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
b700: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
b710: 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
b720: 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
b730: 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
b740: 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
b750: 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
b760: 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
b770: 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
b780: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
b790: 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
b7a0: 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
b7b0: 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
b7c0: 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
b7d0: 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
b7e0: 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
b7f0: 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
b800: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 68 65  *.** Set the che
b810: 63 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  ckpoint..**.** T
b820: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
b830: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
b840: 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
b850: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
b860: 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
b870: 77 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  w checkpoint jou
b880: 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
b890: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
b8a0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
b8b0: 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
b8c0: 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
b8d0: 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
b8e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
b8f0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
b900: 63 6b 70 74 5f 62 65 67 69 6e 28 50 61 67 65 72  ckpt_begin(Pager
b910: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
b920: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
b930: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
b940: 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
b950: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b960: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65  alOpen );.  asse
b970: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70  rt( !pPager->ckp
b980: 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61 67  tInUse );.  pPag
b990: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71  er->aInCkpt = sq
b9a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
b9b0: 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
b9c0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
b9d0: 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a  ->aInCkpt==0 ){.
b9e0: 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64      sqliteOsRead
b9f0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
ba00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ba10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
ba20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46    rc = sqliteOsF
ba30: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
ba40: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
ba50: 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  kptJSize);.  if(
ba60: 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f   rc ) goto ckpt_
ba70: 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
ba80: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
ba90: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
baa0: 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  e;.  if( !pPager
bab0: 2d 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20  ->ckptOpen ){.  
bac0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
bad0: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
bae0: 70 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64  p, &pPager->cpfd
baf0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
bb00: 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f  goto ckpt_begin_
bb10: 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
bb20: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31  er->ckptOpen = 1
bb30: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
bb40: 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  ckptInUse = 1;. 
bb50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bb60: 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f  K;. .ckpt_begin_
bb70: 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
bb80: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b  ager->aInCkpt ){
bb90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bba0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29  pPager->aInCkpt)
bbb0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
bbc0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nCkpt = 0;.  }. 
bbd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bbe0: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68  *.** Commit a ch
bbf0: 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
bc00: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
bc10: 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
bc20: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
bc30: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
bc40: 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
bc50: 50 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73  Pg;.    sqliteOs
bc60: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
bc70: 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->cpfd, 0);.    
bc80: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
bc90: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
bca0: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
bcb0: 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50  InCkpt );.    pP
bcc0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
bcd0: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
bce0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
bcf0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
bd00: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
bd10: 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  >inCkpt = 0;.   
bd20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bd30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bd40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63  .** Rollback a c
bd50: 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  heckpoint..*/.in
bd60: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  t sqlitepager_ck
bd70: 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  pt_rollback(Page
bd80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
bd90: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
bda0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
bdb0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
bdc0: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  ckpt_playback(pP
bdd0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
bde0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d  epager_ckpt_comm
bdf0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
be00: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
be10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
be20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
be30: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
be40: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
be50: 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
be60: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
be70: 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
be80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
be90: 65 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  epager_refdump(P
bea0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
beb0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
bec0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
bed0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
bee0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
bef0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
bf00: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
bf10: 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20     printf("PAGE 
bf20: 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %3d addr=0x%08x 
bf30: 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
bf40: 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28      pPg->pgno, (
bf50: 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
bf60: 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
bf70: 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
bf80: 0a                                               .