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

Artifact 3678afeb3f8ff4af3e4538e4a586b01198458046:


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 39 38  : pager.c,v 1.98
0350: 20 32 30 30 34 2f 30 32 2f 31 30 20 32 33 3a 35   2004/02/10 23:5
0360: 31 3a 30 36 20 64 72 68 20 45 78 70 20 24 0a 2a  1:06 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
0d10: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
0d20: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 70 61  ld call sqlitepa
0d30: 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61  ger_write() on a
0d40: 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d   page prior to m
0d50: 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64  aking.** any mod
0d60: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
0d70: 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  at page.  The fi
0d80: 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 70  rst time sqlitep
0d90: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
0da0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
0db0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
0dc0: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
0dd0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
0de0: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
0df0: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
0e00: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
0e10: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
0e20: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
0e30: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
0e40: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
0e50: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
0e60: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
0e70: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
0e80: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
0e90: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
0ea0: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
0eb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
0ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
0ed0: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
0ee0: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
0ef0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
0f00: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
0f10: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
0f20: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
0f30: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
0f40: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
0f50: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
0f60: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61  te() is called a
0f70: 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nd.** is cleared
0f80: 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20   again when the 
0f90: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
0fa0: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
0fb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
0fc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0fd0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0fe0: 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74   PgHdr PgHdr;.st
0ff0: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
1000: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1020: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
1030: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
1040: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
1050: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
1060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1070: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1080: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1090: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
10a0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
10b0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
10c0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
10d0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  .pgno */.  int n
10e0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1100: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1110: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1120: 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c  gHdr *pNextFree,
1130: 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a   *pPrevFree;  /*
1140: 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67   Freelist of pag
1150: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
1160: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1170: 78 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c 6c  xtAll, *pPrevAll
1180: 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ;    /* A list o
1190: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
11a0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 43 6b 70   PgHdr *pNextCkp
11b0: 74 2c 20 2a 70 50 72 65 76 43 6b 70 74 3b 20 20  t, *pPrevCkpt;  
11c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
11d0: 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69   in the checkpoi
11e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
11f0: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1210: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
1220: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
1230: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1240: 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  Ckpt;           
1250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1260: 45 20 69 66 20 77 72 69 74 74 65 6e 20 74 6f 20  E if written to 
1270: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1280: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1290: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
12a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
12b0: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
12c0: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
12d0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
12e0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
12f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1300: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1310: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1320: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1330: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1340: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1350: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1360: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1370: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
1380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1390: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
13a0: 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72   sorted by PgHdr
13b0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51  .pgno */.  /* SQ
13c0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
13d0: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
13e0: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
13f0: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1400: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1410: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1420: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1430: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1440: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
1450: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
1460: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
1470: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
1480: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
1490: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
14a0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
14b0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
14c0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
14d0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
14e0: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
14f0: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
1500: 28 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63  (P) ((void*)&((c
1510: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
1520: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
1530: 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69  ])../*.** How bi
1540: 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  g to make the ha
1550: 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  sh table used fo
1560: 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65  r locating in-me
1570: 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79  mory pages.** by
1580: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
1590: 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41  .#define N_PG_HA
15a0: 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48  SH 2048../*.** H
15b0: 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ash a page numbe
15c0: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67  r.*/.#define pag
15d0: 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50  er_hash(PN)  ((P
15e0: 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29  N)&(N_PG_HASH-1)
15f0: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
1600: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
1610: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1620: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1630: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
1640: 50 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20 2a  Pager {.  char *
1650: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
1660: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1670: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1680: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
1690: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
16a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
16d0: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
16e0: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
16f0: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
1700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
1710: 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66  .  OsFile fd, jf
1720: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1730: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1740: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
1750: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
1760: 20 4f 73 46 69 6c 65 20 63 70 66 64 3b 20 20 20   OsFile cpfd;   
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1780: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1790: 66 6f 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  for the checkpoi
17a0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
17b0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17e0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
17f0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
1810: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
1820: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
1830: 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 53 69 7a  */.  int ckptSiz
1840: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1850: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
1860: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
1870: 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20  at ckpt_begin() 
1880: 2a 2f 0a 20 20 6f 66 66 5f 74 20 63 6b 70 74 4a  */.  off_t ckptJ
1890: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
18a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
18b0: 6e 61 6c 20 61 74 20 63 6b 70 74 5f 62 65 67 69  nal at ckpt_begi
18c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
18d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
1900: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
1910: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
1920: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1930: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
1940: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
1950: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
1960: 0a 20 20 69 6e 74 20 63 6b 70 74 4e 52 65 63 3b  .  int ckptNRec;
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
1990: 72 64 73 20 69 6e 20 74 68 65 20 63 68 65 63 6b  rds in the check
19a0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f  point journal */
19b0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
19e0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
19f0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
1a00: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75    void (*xDestru
1a10: 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  ctor)(void*); /*
1a20: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
1a30: 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20  ne when freeing 
1a40: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
1a50: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1a70: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
1a80: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
1a90: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ab0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
1ac0: 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48  y pages with PgH
1ad0: 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69  dr.nRef>0 */.  i
1ae0: 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20  nt mxPage;      
1af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1b00: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
1b10: 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e  pages to hold in
1b20: 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20   cache */.  int 
1b30: 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76  nHit, nMiss, nOv
1b40: 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65  fl;     /* Cache
1b50: 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20   hits, missing, 
1b60: 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77  and LRU overflow
1b70: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
1b80: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
1b90: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  *,int); /* Routi
1ba0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
1bb0: 6e 67 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61 20  ng on-disk data 
1bc0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
1bd0: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
1be0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
1bf0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
1c00: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1c10: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1c20: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1c30: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
1c40: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
1c50: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
1c60: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
1c70: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
1c80: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
1c90: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
1ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1cb0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
1cc0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1cd0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1ce0: 20 20 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20    u8 ckptOpen;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 68 65   True if the che
1d10: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1d20: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
1d30: 63 6b 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20  ckptInUse;      
1d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d50: 20 77 65 20 61 72 65 20 69 6e 20 61 20 63 68 65   we are in a che
1d60: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
1d70: 63 6b 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  ckptAutoopen;   
1d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1d90: 20 63 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68   ckpt journal wh
1da0: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
1db0: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
1dc0: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
1dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1de0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
1df0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
1e00: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
1e30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1e40: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
1e50: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c  * SQLITE_UNLOCK,
1e80: 20 5f 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57   _READLOCK or _W
1e90: 52 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38  RITELOCK */.  u8
1ea0: 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20   errMask;       
1eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
1ec0: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
1ed0: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
1ee0: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f00: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
1f10: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
1f20: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f40: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
1f50: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1f60: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
1f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f80: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
1f90: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
1fa0: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1fb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c  */.  u8 dirtyFil
1fc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fd0: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74 61   /* True if data
1fe0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 63 68  base file has ch
1ff0: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79  anged in any way
2000: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2010: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2020: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
2030: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
2040: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2050: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
2060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2070: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2080: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2090: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
20a0: 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20  8 *aInCkpt;     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
20c0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
20d0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
20e0: 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ase */.  PgHdr *
20f0: 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20  pFirst, *pLast; 
2100: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2110: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
2120: 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e  PgHdr *pFirstSyn
2130: 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  ced;        /* F
2140: 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77  irst free page w
2150: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
2160: 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  nc==0 */.  PgHdr
2170: 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20   *pAll;         
2180: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2190: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
21a0: 20 50 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20   PgHdr *pCkpt;  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
21d0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
21e0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48  journal */.  PgH
21f0: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
2200: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
2210: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
2220: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48  ge number of PgH
2230: 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  dr */.};../*.** 
2240: 54 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74  These are bits t
2250: 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69  hat can be set i
2260: 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e  n Pager.errMask.
2270: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
2280: 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30  R_ERR_FULL     0
2290: 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28  x01  /* a write(
22a0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
22b0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  ine PAGER_ERR_ME
22c0: 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20  M      0x02  /* 
22d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
22e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
22f0: 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78  _ERR_LOCK     0x
2300: 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20  04  /* error in 
2310: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  the locking prot
2320: 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ocol */.#define 
2330: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
2340: 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61  T  0x08  /* data
2350: 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  base or journal 
2360: 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64  corruption */.#d
2370: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
2380: 44 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f  DISK     0x10  /
2390: 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49  * general disk I
23a0: 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68  /O error - bad h
23b0: 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f  ard drive? */../
23c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
23d0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70   file contains p
23e0: 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74  age records in t
23f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
2400: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63  format..**.** Ac
2410: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72  tually, this str
2420: 75 63 74 75 72 65 20 69 73 20 74 68 65 20 63 6f  ucture is the co
2430: 6d 70 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f  mplete page reco
2440: 72 64 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  rd for pager.** 
2450: 66 6f 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61  formats less tha
2460: 6e 20 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20  n 3.  Beginning 
2470: 77 69 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74  with format 3, t
2480: 68 69 73 20 72 65 63 6f 72 64 20 69 73 20 73 75  his record is su
2490: 72 72 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74  rrounded.** by t
24a0: 77 6f 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f  wo checksums..*/
24b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
24c0: 50 61 67 65 52 65 63 6f 72 64 20 50 61 67 65 52  PageRecord PageR
24d0: 65 63 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61  ecord;.struct Pa
24e0: 67 65 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e  geRecord {.  Pgn
24f0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2510: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
2520: 2a 2f 0a 20 20 63 68 61 72 20 61 44 61 74 61 5b  */.  char aData[
2530: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
2540: 5d 3b 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c  ];   /* Original
2550: 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 70   data for page p
2560: 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  gno */.};../*.**
2570: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
2580: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
2590: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
25a0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
25b0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
25c0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
25d0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
25e0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
25f0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  heck..**.** Ther
2600: 65 20 61 72 65 20 74 68 72 65 65 20 6a 6f 75 72  e are three jour
2610: 6e 61 6c 20 66 6f 72 6d 61 74 73 20 28 73 6f 20  nal formats (so 
2620: 66 61 72 29 2e 20 54 68 65 20 31 73 74 20 6a 6f  far). The 1st jo
2630: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77 72 69  urnal format wri
2640: 74 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20 69 6e  tes.** 32-bit in
2650: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 62 79  tegers in the by
2660: 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20  te-order of the 
2670: 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20 20 4e  host machine.  N
2680: 65 77 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 77 72  ew.** formats wr
2690: 69 74 65 73 20 69 6e 74 65 67 65 72 73 20 61 73  ites integers as
26a0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 20 20 41 6c   big-endian.  Al
26b0: 6c 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 73 20 75  l new journals u
26c0: 73 65 20 74 68 65 0a 2a 2a 20 6e 65 77 20 66 6f  se the.** new fo
26d0: 72 6d 61 74 2c 20 62 75 74 20 77 65 20 68 61 76  rmat, but we hav
26e0: 65 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  e to be able to 
26f0: 72 65 61 64 20 61 6e 20 6f 6c 64 65 72 20 6a 6f  read an older jo
2700: 75 72 6e 61 6c 20 69 6e 20 6f 72 64 65 72 0a 2a  urnal in order.*
2710: 2a 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  * to rollback jo
2720: 75 72 6e 61 6c 73 20 63 72 65 61 74 65 64 20 62  urnals created b
2730: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
2740: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e   of the library.
2750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64 20 6a  .**.** The 3rd j
2760: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 28 61  ournal format (a
2770: 64 64 65 64 20 66 6f 72 20 32 2e 38 2e 30 29 20  dded for 2.8.0) 
2780: 61 64 64 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  adds additional 
2790: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
27a0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ng information t
27b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
27c0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
27d0: 6c 73 20 77 68 69 6c 65 20 74 68 65 0a 2a 2a 20  ls while the.** 
27e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
27f0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2800: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2810: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2820: 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  in.** the journa
2830: 6c 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  l file after pow
2840: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2850: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2860: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2870: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2880: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2890: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
28a0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
28b0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
28c0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
28d0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
28e0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
28f0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2900: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2910: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2920: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2930: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2940: 6f 72 20 74 68 65 20 33 72 64 20 6a 6f 75 72 6e  or the 3rd journ
2950: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2960: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2970: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
2980: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
2990: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
29a0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
29b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
29c0: 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41 47  d the SQLITE_PAG
29d0: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
29e0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
29f0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
2a00: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2a10: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
2a20: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
2a30: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
2a40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
2a50: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
2a60: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
2a70: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
2a80: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
2a90: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
2aa0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
2ab0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
2ac0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
2ad0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
2ae0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
2af0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
2b00: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
2b10: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
2b20: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
2b30: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
2b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
2b50: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
2b60: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
2b70: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
2b80: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
2b90: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
2ba0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
2bb0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2bc0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
2bd0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
2be0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
2bf0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2c00: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  r aJournalMagic1
2c10: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
2c20: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
2c30: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
2c40: 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73 74 61 74  3, 0xd4,.};.stat
2c50: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
2c60: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
2c70: 61 67 69 63 32 5b 5d 20 3d 20 7b 0a 20 20 30 78  agic2[] = {.  0x
2c80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
2c90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
2ca0: 2c 20 30 78 36 33 2c 20 30 78 64 35 2c 0a 7d 3b  , 0x63, 0xd5,.};
2cb0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
2cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
2cd0: 72 6e 61 6c 4d 61 67 69 63 33 5b 5d 20 3d 20 7b  rnalMagic3[] = {
2ce0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
2cf0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
2d00: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
2d10: 36 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4a 4f  6,.};.#define JO
2d20: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 31  URNAL_FORMAT_1 1
2d30: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
2d40: 5f 46 4f 52 4d 41 54 5f 32 20 32 0a 23 64 65 66  _FORMAT_2 2.#def
2d50: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  ine JOURNAL_FORM
2d60: 41 54 5f 33 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT_3 3../*.** Th
2d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65  e following inte
2d80: 67 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ger determines w
2d90: 68 61 74 20 66 6f 72 6d 61 74 20 74 6f 20 75 73  hat format to us
2da0: 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0a  e when creating.
2db0: 2a 2a 20 6e 65 77 20 70 72 69 6d 61 72 79 20 6a  ** new primary j
2dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 20 20 42  ournal files.  B
2dd0: 79 20 64 65 66 61 75 6c 74 20 77 65 20 61 6c 77  y default we alw
2de0: 61 79 73 20 75 73 65 20 66 6f 72 6d 61 74 20 33  ays use format 3
2df0: 2e 0a 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e  ..** When testin
2e00: 67 2c 20 77 65 20 63 61 6e 20 73 65 74 20 74 68  g, we can set th
2e10: 69 73 20 76 61 6c 75 65 20 74 6f 20 6f 6c 64 65  is value to olde
2e20: 72 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  r journal format
2e30: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  s in order to.**
2e40: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
2e50: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
2e60: 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 72  f the library ar
2e70: 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
2e80: 63 6b 20 6f 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72  ck older.** jour
2e90: 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
2ea0: 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
2eb0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 61  point journals a
2ec0: 6c 77 61 79 73 20 75 73 65 20 66 6f 72 6d 61 74  lways use format
2ed0: 20 32 20 61 6e 64 20 6f 6d 69 74 20 74 68 65 20   2 and omit the 
2ee0: 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65  header..*/.#ifde
2ef0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2f00: 74 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  t journal_format
2f10: 20 3d 20 33 3b 0a 23 65 6c 73 65 0a 23 20 64 65   = 3;.#else.# de
2f20: 66 69 6e 65 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72  fine journal_for
2f30: 6d 61 74 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  mat 3.#endif../*
2f40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
2f50: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
2f60: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
2f70: 68 65 20 6a 6f 75 72 6e 61 6c 20 76 61 72 69 65  he journal varie
2f80: 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74  s according.** t
2f90: 6f 20 77 68 69 63 68 20 6a 6f 75 72 6e 61 6c 20  o which journal 
2fa0: 66 6f 72 6d 61 74 20 69 73 20 62 65 69 6e 67 20  format is being 
2fb0: 75 73 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  used.  The follo
2fc0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 66 69 67 75  wing macros figu
2fd0: 72 65 20 6f 75 74 0a 2a 2a 20 74 68 65 20 73 69  re out.** the si
2fe0: 7a 65 73 20 62 61 73 65 64 20 6f 6e 20 66 6f 72  zes based on for
2ff0: 6d 61 74 20 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a  mat numbers..*/.
3000: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3010: 48 44 52 5f 53 5a 28 58 29 20 5c 0a 20 20 20 28  HDR_SZ(X) \.   (
3020: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
3030: 61 67 69 63 31 29 20 2b 20 73 69 7a 65 6f 66 28  agic1) + sizeof(
3040: 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e 3d 33 29  Pgno) + ((X)>=3)
3050: 2a 32 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 0a  *2*sizeof(u32)).
3060: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3070: 50 47 5f 53 5a 28 58 29 20 5c 0a 20 20 20 28 53  PG_SZ(X) \.   (S
3080: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
3090: 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b  + sizeof(Pgno) +
30a0: 20 28 28 58 29 3e 3d 33 29 2a 73 69 7a 65 6f 66   ((X)>=3)*sizeof
30b0: 28 75 33 32 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e  (u32))../*.** En
30c0: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
30d0: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65  ount tracking he
30e0: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
30f0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
3100: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e  pager_refinfo_en
3110: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
3120: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
3130: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
3140: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
3150: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
3160: 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f   !pager_refinfo_
3170: 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  enable ) return;
3180: 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20  .    printf(.   
3190: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
31a0: 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
31b0: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
31c0: 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  p->pgno, (int)PG
31d0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
31e0: 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  p->nRef.    );. 
31f0: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
3200: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
3210: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
3220: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
3230: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
3240: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
3250: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
3260: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  NFO(X).#endif../
3270: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
3280: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
3290: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
32a0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
32b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
32c0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
32d0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
32e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
32f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
3300: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
3310: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
3320: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
3330: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
3340: 6c 20 66 6f 72 6d 61 74 20 69 73 20 32 20 6f 72  l format is 2 or
3350: 20 33 2c 20 72 65 61 64 20 61 20 62 69 67 2d 65   3, read a big-e
3360: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
3370: 49 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  If the.** journa
3380: 6c 20 66 6f 72 6d 61 74 20 69 73 20 31 2c 20 72  l format is 1, r
3390: 65 61 64 20 61 6e 20 69 6e 74 65 67 65 72 20 69  ead an integer i
33a0: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 62 79 74  n the native byt
33b0: 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 2a  e-order of the.*
33c0: 2a 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 0a  * host machine..
33d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
33e0: 61 64 33 32 62 69 74 73 28 69 6e 74 20 66 6f 72  ad32bits(int for
33f0: 6d 61 74 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c  mat, OsFile *fd,
3400: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
3410: 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63  32 res;.  int rc
3420: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  ;.  rc = sqliteO
3430: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
3440: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
3450: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3460: 4b 20 26 26 20 66 6f 72 6d 61 74 3e 4a 4f 55 52  K && format>JOUR
3470: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 7b 0a  NAL_FORMAT_1 ){.
3480: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3490: 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d  r ac[4];.    mem
34a0: 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29  cpy(ac, &res, 4)
34b0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b  ;.    res = (ac[
34c0: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
34d0: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
34e0: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a  8) | ac[3];.  }.
34f0: 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20    *pRes = res;. 
3500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3510: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
3520: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
3530: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
3540: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
3550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
3560: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
3570: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
3580: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
3590: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rong..**.** If t
35a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
35b0: 74 20 69 73 20 32 20 6f 72 20 33 2c 20 77 72 69  t is 2 or 3, wri
35c0: 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 61  te the integer a
35d0: 73 20 34 20 62 69 67 2d 65 6e 64 69 61 6e 0a 2a  s 4 big-endian.*
35e0: 2a 20 62 79 74 65 73 2e 20 20 49 66 20 74 68 65  * bytes.  If the
35f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3600: 69 73 20 31 2c 20 77 72 69 74 65 20 74 68 65 20  is 1, write the 
3610: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e  integer in the n
3620: 61 74 69 76 65 0a 2a 2a 20 62 79 74 65 20 6f 72  ative.** byte or
3630: 64 65 72 2e 20 20 49 6e 20 6e 6f 72 6d 61 6c 20  der.  In normal 
3640: 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 6e 6c 79 20  operation, only 
3650: 66 6f 72 6d 61 74 73 20 32 20 61 6e 64 20 33 20  formats 2 and 3 
3660: 61 72 65 20 75 73 65 64 2e 0a 2a 2a 20 4a 6f 75  are used..** Jou
3670: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 31 20 69 73  rnal format 1 is
3680: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 74   only used for t
3690: 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  esting..*/.stati
36a0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
36b0: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
36c0: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
36d0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
36e0: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
36f0: 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65  mat<=1 ){.    re
3700: 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57 72 69  turn sqliteOsWri
3710: 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34 29 3b  te(fd, &val, 4);
3720: 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d 20 28  .  }.  ac[0] = (
3730: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
3740: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
3750: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
3760: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
3770: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
3780: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3790: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57  return sqliteOsW
37a0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
37b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
37c0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
37d0: 20 69 6e 74 6f 20 61 20 70 61 67 65 20 68 65 61   into a page hea
37e0: 64 65 72 20 72 69 67 68 74 20 62 65 66 6f 72 65  der right before
37f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
3800: 61 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6f 76  a.  This will ov
3810: 65 72 77 72 69 74 65 20 74 68 65 20 50 67 48 64  erwrite the PgHd
3820: 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
3830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
3840: 67 65 72 20 69 73 20 62 69 67 2d 65 6e 64 69 61  ger is big-endia
3850: 6e 20 66 6f 72 20 66 6f 72 6d 61 74 73 20 32 20  n for formats 2 
3860: 61 6e 64 20 33 20 61 6e 64 20 6e 61 74 69 76 65  and 3 and native
3870: 20 62 79 74 65 20 6f 72 64 65 72 0a 2a 2a 20 66   byte order.** f
3880: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  or journal forma
3890: 74 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t 1..*/.static v
38a0: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
38b0: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
38c0: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
38d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
38e0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75  *ac;.  ac = &((u
38f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47  nsigned char*)PG
3900: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b  HDR_TO_DATA(p))[
3910: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 6a  offset];.  if( j
3920: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3c 3d 31  ournal_format<=1
3930: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61   ){.    memcpy(a
3940: 63 2c 20 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d  c, &val, 4);.  }
3950: 65 6c 73 65 7b 0a 20 20 20 20 61 63 5b 30 5d 20  else{.    ac[0] 
3960: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3970: 66 66 3b 0a 20 20 20 20 61 63 5b 31 5d 20 3d 20  ff;.    ac[1] = 
3980: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
3990: 3b 0a 20 20 20 20 61 63 5b 32 5d 20 3d 20 28 76  ;.    ac[2] = (v
39a0: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
39b0: 20 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26     ac[3] = val &
39c0: 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   0xff;.  }.}.../
39d0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
39e0: 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61   bits in the pPa
39f0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74  ger->errMask int
3a00: 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a  o an approprate.
3a10: 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  ** return code..
3a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3a30: 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65  ger_errcode(Page
3a40: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
3a50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3a60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3a70: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
3a80: 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63  ERR_LOCK )    rc
3a90: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
3aa0: 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OL;.  if( pPager
3ab0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3ac0: 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20  R_ERR_DISK )    
3ad0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
3ae0: 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  R;.  if( pPager-
3af0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
3b00: 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72  _ERR_FULL )    r
3b10: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
3b20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
3b30: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
3b40: 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20  RR_MEM )     rc 
3b50: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
3b60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
3b70: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
3b80: 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d  R_CORRUPT ) rc =
3b90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
3ba0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3bb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
3bc0: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
3bd0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
3be0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
3bf0: 69 6e 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70  in the.** checkp
3c00: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
3c10: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
3c20: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
3c30: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
3c40: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
3c50: 69 6e 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 70  in.** the checkp
3c60: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  oint journal.  T
3c70: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
3c80: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63  litepager_ckpt_c
3c90: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
3ca0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
3cb0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
3cc0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
3cd0: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
3ce0: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
3cf0: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
3d00: 65 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f  e in the checkpo
3d10: 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  int journal..*/.
3d20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
3d30: 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73  _add_to_ckpt_lis
3d40: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
3d50: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
3d60: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
3d70: 69 66 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20  if( pPg->inCkpt 
3d80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
3d90: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b  rt( pPg->pPrevCk
3da0: 70 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  pt==0 && pPg->pN
3db0: 65 78 74 43 6b 70 74 3d 3d 30 20 29 3b 0a 20 20  extCkpt==0 );.  
3dc0: 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d  pPg->pPrevCkpt =
3dd0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
3de0: 2d 3e 70 43 6b 70 74 20 29 7b 0a 20 20 20 20 70  ->pCkpt ){.    p
3df0: 50 61 67 65 72 2d 3e 70 43 6b 70 74 2d 3e 70 50  Pager->pCkpt->pP
3e00: 72 65 76 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20  revCkpt = pPg;. 
3e10: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 43   }.  pPg->pNextC
3e20: 6b 70 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 43  kpt = pPager->pC
3e30: 6b 70 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  kpt;.  pPager->p
3e40: 43 6b 70 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Ckpt = pPg;.  pP
3e50: 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 7d  g->inCkpt = 1;.}
3e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
3e70: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b  e_remove_from_ck
3e80: 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  pt_list(PgHdr *p
3e90: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
3ea0: 3e 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e  >inCkpt ) return
3eb0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
3ec0: 65 76 43 6b 70 74 20 29 7b 0a 20 20 20 20 61 73  evCkpt ){.    as
3ed0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
3ee0: 43 6b 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 3d  Ckpt->pNextCkpt=
3ef0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
3f00: 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78  >pPrevCkpt->pNex
3f10: 74 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tCkpt = pPg->pNe
3f20: 78 74 43 6b 70 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtCkpt;.  }else{
3f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
3f40: 2d 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3d  ->pPager->pCkpt=
3f50: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
3f60: 3e 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d  >pPager->pCkpt =
3f70: 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b   pPg->pNextCkpt;
3f80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
3f90: 70 4e 65 78 74 43 6b 70 74 20 29 7b 0a 20 20 20  pNextCkpt ){.   
3fa0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
3fb0: 65 78 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b  extCkpt->pPrevCk
3fc0: 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  pt==pPg );.    p
3fd0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70  Pg->pNextCkpt->p
3fe0: 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67 2d 3e  PrevCkpt = pPg->
3ff0: 70 50 72 65 76 43 6b 70 74 3b 0a 20 20 7d 0a 20  pPrevCkpt;.  }. 
4000: 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20   pPg->pNextCkpt 
4010: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
4020: 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67  vCkpt = 0;.  pPg
4030: 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 7d 0a  ->inCkpt = 0;.}.
4040: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
4050: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
4060: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
4070: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
4080: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
4090: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
40a0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
40b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
40c0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
40d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
40e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
40f0: 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d  Hdr *p = pPager-
4100: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
4110: 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c  h(pgno)];.  whil
4120: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
4130: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
4140: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
4150: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
4160: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
4170: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
4180: 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d  clear the in-mem
4190: 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73  ory cache.  This
41a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73   routine.** sets
41b0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
41c0: 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
41d0: 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
41e0: 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a   it was first.**
41f0: 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75   opened.  Any ou
4200: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
4210: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
4220: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
4230: 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63  ttempts.** to ac
4240: 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73  cess those pages
4250: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
4260: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
4270: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
4280: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
4290: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
42a0: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
42b0: 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  xt;.  for(pPg=pP
42c0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
42d0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
42e0: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
42f0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
4300: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
4310: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
4320: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
4330: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
4340: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
4350: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
4360: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65  ->pAll = 0;.  me
4370: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
4380: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
4390: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
43a0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
43b0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
43c0: 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f  ->state>=SQLITE_
43d0: 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
43e0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
43f0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
4400: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c   }.  sqliteOsUnl
4410: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
4420: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
4430: 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  e = SQLITE_UNLOC
4440: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
4450: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
4460: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
4470: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4480: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
4490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
44a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
44b0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
44c0: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
44d0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
44e0: 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ** a write lock 
44f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
4500: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
4510: 65 6c 65 61 73 65 73 20 74 68 65 20 64 61 74 61  eleases the data
4520: 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f  base.** write lo
4530: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
4540: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69  a read lock in i
4550: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
4560: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
4570: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
4580: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
4590: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
45a0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
45b0: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
45c0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
45d0: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
45e0: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
45f0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
4600: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
4610: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
4620: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
4630: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
4640: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
4650: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
4660: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4670: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
4680: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
4690: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
46a0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
46b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
46c0: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
46d0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
46e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
46f0: 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  kptOpen ){.    s
4700: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
4710: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
4720: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65   pPager->ckptOpe
4730: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
4740: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
4750: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
4760: 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  teOsClose(&pPage
4770: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4780: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
4790: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
47a0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
47b0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
47c0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
47d0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
47e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
47f0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
4800: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4810: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4820: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
4830: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
4840: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
4850: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
4860: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
4870: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
4880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
4890: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
48a0: 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  tyFile==0 || pPa
48b0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
48c0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
48d0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
48e0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
48f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4900: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
4910: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4920: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65  E_READLOCK;.  }e
4930: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
4940: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
4950: 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64 6f   if a process do
4960: 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65 6e  es a BEGIN, then
4970: 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a 20   forks and the. 
4980: 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63     ** child proc
4990: 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f 4d  ess does the COM
49a0: 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f 66  MIT.  Because of
49b0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
49c0: 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69  f unix.    ** fi
49d0: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20  le locking, the 
49e0: 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c  unlock will fail
49f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
4a00: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4a10: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  ITE_UNLOCK;.  }.
4a20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4a30: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4a40: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4a50: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4a60: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
4a70: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
4a80: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
4a90: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
4aa0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
4ab0: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
4ac0: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
4ad0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
4ae0: 20 63 6f 6e 73 69 64 65 72 65 64 20 64 6f 20 61   considered do a
4af0: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20   checksum.** of 
4b00: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62 75  the database, bu
4b10: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
4b20: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
4b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4b40: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
4b50: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
4b60: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
4b70: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
4b80: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
4b90: 6b 73 75 6d 49 6e 69 74 20 2b 20 70 67 6e 6f 3b  ksumInit + pgno;
4ba0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4bc0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
4bd0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
4be0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
4bf0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
4c00: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
4c10: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
4c20: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68  .** There are th
4c30: 72 65 65 20 64 69 66 66 65 72 65 6e 74 20 6a 6f  ree different jo
4c40: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 2e 20 20  urnal formats.  
4c50: 54 68 65 20 66 6f 72 6d 61 74 20 70 61 72 61 6d  The format param
4c60: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 0a  eter determines.
4c70: 2a 2a 20 77 68 69 63 68 20 66 6f 72 6d 61 74 20  ** which format 
4c80: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6a  is used by the j
4c90: 6f 75 72 6e 61 6c 20 74 68 61 74 20 69 73 20 70  ournal that is p
4ca0: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  layed back..*/.s
4cb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4cc0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
4cd0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
4ce0: 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e   OsFile *jfd, in
4cf0: 74 20 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  t format){.  int
4d00: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
4d10: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
4d20: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
4d30: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
4d40: 20 2a 2f 0a 20 20 50 61 67 65 52 65 63 6f 72 64   */.  PageRecord
4d50: 20 70 67 52 65 63 3b 0a 20 20 75 33 32 20 63 6b   pgRec;.  u32 ck
4d60: 73 75 6d 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  sum;..  rc = rea
4d70: 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20  d32bits(format, 
4d80: 6a 66 64 2c 20 26 70 67 52 65 63 2e 70 67 6e 6f  jfd, &pgRec.pgno
4d90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4da0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
4db0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
4dc0: 65 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 70 67  eOsRead(jfd, &pg
4dd0: 52 65 63 2e 61 44 61 74 61 2c 20 73 69 7a 65 6f  Rec.aData, sizeo
4de0: 66 28 70 67 52 65 63 2e 61 44 61 74 61 29 29 3b  f(pgRec.aData));
4df0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4e00: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
4e10: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
4e20: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
4e30: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
4e40: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
4e50: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
4e60: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
4e70: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
4e80: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
4e90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
4ea0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
4eb0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
4ec0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
4ed0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
4ee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
4ef0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
4f00: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
4f10: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
4f20: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
4f30: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
4f40: 2a 2f 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70  */.  if( pgRec.p
4f50: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
4f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
4f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 52 65  ;.  }.  if( pgRe
4f80: 63 2e 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  c.pgno>(unsigned
4f90: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
4fa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4fb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
4fc0: 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e  f( format>=JOURN
4fd0: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
4fe0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
4ff0: 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20  ts(format, jfd, 
5000: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
5010: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5020: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
5030: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 52  ksum(pPager, pgR
5040: 65 63 2e 70 67 6e 6f 2c 20 70 67 52 65 63 2e 61  ec.pgno, pgRec.a
5050: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
5060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5070: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
5080: 20 20 7d 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61    }..  /* Playba
5090: 63 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70  ck the page.  Up
50a0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
50b0: 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  ry copy of the p
50c0: 61 67 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  age.  ** at the 
50d0: 73 61 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68  same time, if th
50e0: 65 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f  ere is one..  */
50f0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
5100: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
5110: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 54 52 41  Rec.pgno);.  TRA
5120: 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE2("PLAYBACK %d
5130: 5c 6e 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29  \n", pgRec.pgno)
5140: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  ;.  sqliteOsSeek
5150: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
5160: 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66  gRec.pgno-1)*(of
5170: 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f  f_t)SQLITE_PAGE_
5180: 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  SIZE);.  rc = sq
5190: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
51a0: 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61  ger->fd, pgRec.a
51b0: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
51c0: 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70  E_SIZE);.  if( p
51d0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
51e0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
51f0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
5200: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
5210: 65 78 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a  except for page.
5220: 20 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69      ** 1 which i
5230: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
5240: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
5250: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
5260: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61  atabase.    ** a
5270: 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ctive..    */.  
5280: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
5290: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
52a0: 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 6d 65  gno==1 );.    me
52b0: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
52c0: 54 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61  TA(pPg), pgRec.a
52d0: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
52e0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d  E_SIZE);.    mem
52f0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
5300: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
5310: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
5320: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
5330: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
5340: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nc = 0;.    if( 
5350: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 29  pPager->xCodec )
5360: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
5370: 78 43 6f 64 65 63 28 70 50 61 67 65 72 2d 3e 70  xCodec(pPager->p
5380: 43 6f 64 65 63 41 72 67 2c 20 50 47 48 44 52 5f  CodecArg, PGHDR_
5390: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 33 29  TO_DATA(pPg), 3)
53a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
53b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
53c0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
53d0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
53e0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
53f0: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
5400: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
5410: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
5420: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
5430: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
5440: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
5450: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
5460: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ows: .**.**    *
5470: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
5480: 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 61 4a 6f    One of the aJo
5490: 75 72 6e 61 6c 4d 61 67 69 63 31 32 33 20 76 65  urnalMagic123 ve
54a0: 63 74 6f 72 73 20 64 65 66 69 6e 65 64 0a 2a 2a  ctors defined.**
54b0: 20 20 20 20 20 20 20 61 62 6f 76 65 2e 20 20 54         above.  T
54c0: 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  he format of the
54d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
54e0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 77   determined by w
54f0: 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 6f 66  hich.**       of
5500: 20 74 68 65 20 74 68 72 65 65 20 70 72 65 66 69   the three prefi
5510: 78 20 76 65 63 74 6f 72 73 20 69 73 20 73 65 65  x vectors is see
5520: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 20 34 20 62 79  n..**    *  4 by
5530: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
5540: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
5550: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
5560: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
5570: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
5580: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
5590: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
55a0: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
55b0: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
55c0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
55d0: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
55e0: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 20 20   journal size.  
55f0: 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65 61  This field appea
5600: 72 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 66  rs.**       in f
5610: 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a 2a  ormat 3 only..**
5620: 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 62 69      *  4 byte bi
5630: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
5640: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
5650: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
5660: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
5670: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 20 20  nity checksum.  
5680: 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65 61  This field appea
5690: 72 73 20 69 6e 20 66 6f 72 6d 61 74 20 33 20 6f  rs in format 3 o
56a0: 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20 34 20  nly..**    *  4 
56b0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
56c0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
56d0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
56e0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
56f0: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
5700: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
5710: 2e 0a 2a 2a 20 20 20 20 2a 20 20 5a 65 72 6f 20  ..**    *  Zero 
5720: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
5730: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
5740: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
5750: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
5760: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
5770: 20 20 20 20 20 2b 20 20 53 51 4c 49 54 45 5f 50       +  SQLITE_P
5780: 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f  AGE_SIZE bytes o
5790: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
57a0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
57b0: 6b 73 75 6d 20 28 66 6f 72 6d 61 74 20 33 20 6f  ksum (format 3 o
57c0: 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  nly).**.** When 
57d0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
57e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
57f0: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
5800: 74 20 34 20 62 75 6c 6c 65 74 73 20 61 62 6f 76  t 4 bullets abov
5810: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
5820: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5830: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
5840: 66 20 74 68 65 20 35 74 68 20 62 75 6c 6c 65 74  f the 5th bullet
5850: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 2a 2a 20  .  Note that.** 
5860: 62 75 6c 6c 65 74 73 20 32 20 61 6e 64 20 33 20  bullets 2 and 3 
5870: 6f 6e 6c 79 20 61 70 70 65 61 72 20 69 6e 20 66  only appear in f
5880: 6f 72 6d 61 74 2d 33 20 6a 6f 75 72 6e 61 6c 73  ormat-3 journals
5890: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
58a0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
58b0: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
58c0: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
58d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
58e0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
58f0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
5900: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
5910: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
5920: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
5930: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
5940: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
5950: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
5960: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
5970: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
5980: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
5990: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
59a0: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
59b0: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
59c0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
59d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
59e0: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
59f0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
5a00: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
5a10: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
5a20: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
5a30: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
5a40: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
5a50: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
5a60: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
5a70: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
5a80: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
5a90: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
5aa0: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
5ab0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
5ac0: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
5ad0: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
5ae0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
5af0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
5b00: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
5b10: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
5b20: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
5b30: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
5b40: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
5b50: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
5b60: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
5b70: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
5b80: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
5b90: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
5ba0: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
5bb0: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
5bc0: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
5bd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
5be0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
5bf0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
5c00: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
5c10: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
5c20: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4a 6f  care.  .**.** Jo
5c30: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 31 20  urnal formats 1 
5c40: 61 6e 64 20 32 20 64 6f 20 6e 6f 74 20 68 61 76  and 2 do not hav
5c50: 65 20 61 6e 20 6e 52 65 63 20 76 61 6c 75 65 20  e an nRec value 
5c60: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 73 6f  in the header so
5c70: 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 63   we.** have to c
5c80: 6f 6d 70 75 74 65 20 6e 52 65 63 20 66 72 6f 6d  ompute nRec from
5c90: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
5ca0: 20 54 68 69 73 20 68 61 73 20 72 69 73 6b 73 20   This has risks 
5cb0: 28 61 73 20 64 65 73 63 72 69 62 65 64 0a 2a 2a  (as described.**
5cc0: 20 61 62 6f 76 65 29 20 77 68 69 63 68 20 69 73   above) which is
5cd0: 20 77 68 79 20 61 6c 6c 20 70 65 72 73 69 73 74   why all persist
5ce0: 65 6e 74 20 74 61 62 6c 65 73 20 68 61 76 65 20  ent tables have 
5cf0: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 74 6f 20  been changed to 
5d00: 75 73 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 33 2e  use.** format 3.
5d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
5d20: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
5d40: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
5d50: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
5d60: 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  le then the data
5d70: 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  base will likely
5d80: 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20 63   already be.** c
5d90: 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65  orrupted, so the
5da0: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5db0: 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  PT bit is set in
5dc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
5dd0: 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 43  .** and SQLITE_C
5de0: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
5df0: 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20 77  ed.  If it all w
5e00: 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73 20  orks, then this 
5e10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
5e20: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
5e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5e40: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
5e50: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75 73   *pPager, int us
5e60: 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a 20  eJournalSize){. 
5e70: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
5e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
5e90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
5ea0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
5eb0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ed0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
5ee0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
5ef0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
5f20: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
5f30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
5f40: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
5f50: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
5f60: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 6d  es */.  int form
5f70: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
5f80: 20 2f 2a 20 46 6f 72 6d 61 74 20 6f 66 20 74 68   /* Format of th
5f90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
5fa0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5fb0: 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66  ar aMagic[sizeof
5fc0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
5fd0: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
5fe0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
5ff0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
6000: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
6010: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
6020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
6030: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
6040: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
6050: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
6060: 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65   );.  sqliteOsSe
6070: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
6080: 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
6090: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
60a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
60b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
60c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
60d0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
60e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
60f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6100: 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f   too small to co
6110: 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65  ntain a complete
6120: 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74   header,.  ** it
6130: 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20   must mean that 
6140: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6150: 20 63 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75   created the jou
6160: 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20  rnal was just.  
6170: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20  ** beginning to 
6180: 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
6190: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64  l file when it d
61a0: 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ied.  In that ca
61b0: 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  se,.  ** the dat
61c0: 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
61d0: 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65  d have still bee
61e0: 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63  n completely unc
61f0: 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74  hanged..  ** Not
6200: 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65  hing needs to be
6210: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57   rolled back.  W
6220: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e  e can safely ign
6230: 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ore this journal
6240: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a  ..  */.  if( szJ
6250: 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63   < sizeof(aMagic
6260: 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29  )+sizeof(Pgno) )
6270: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
6280: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
6290: 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69  /* Read the begi
62a0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  nning of the jou
62b0: 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74  rnal and truncat
62c0: 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  e the.  ** datab
62d0: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
62e0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
62f0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
6300: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
6310: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
6320: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6330: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
6340: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6350: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
6360: 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  COL;.    goto en
6370: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
6380: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6390: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
63a0: 69 63 33 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic3, sizeof(aMag
63b0: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
63c0: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
63d0: 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c 73  FORMAT_3;.  }els
63e0: 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61  e if( memcmp(aMa
63f0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6400: 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic2, sizeof(aMag
6410: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
6420: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
6430: 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c 73  FORMAT_2;.  }els
6440: 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61  e if( memcmp(aMa
6450: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6460: 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic1, sizeof(aMag
6470: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
6480: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
6490: 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c 73  FORMAT_1;.  }els
64a0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
64b0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20  TE_PROTOCOL;.   
64c0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
64d0: 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f  ck;.  }.  if( fo
64e0: 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat>=JOURNAL_FO
64f0: 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 69 66  RMAT_3 ){.    if
6500: 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61  ( szJ < sizeof(a
6510: 4d 61 67 69 63 29 20 2b 20 33 2a 73 69 7a 65 6f  Magic) + 3*sizeo
6520: 66 28 75 33 32 29 20 29 7b 0a 20 20 20 20 20 20  f(u32) ){.      
6530: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6a 6f  /* Ignore the jo
6540: 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 74  urnal if it is t
6550: 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74  oo small to cont
6560: 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20  ain a complete. 
6570: 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 2e 20       ** header. 
6580: 20 57 65 20 61 6c 72 65 61 64 79 20 64 69 64 20   We already did 
6590: 74 68 69 73 20 74 65 73 74 20 6f 6e 63 65 20 61  this test once a
65a0: 62 6f 76 65 2c 20 62 75 74 20 61 74 20 74 68 65  bove, but at the
65b0: 20 70 72 69 6f 72 0a 20 20 20 20 20 20 2a 2a 20   prior.      ** 
65c0: 74 65 73 74 2c 20 77 65 20 64 69 64 20 6e 6f 74  test, we did not
65d0: 20 6b 6e 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61   know the journa
65e0: 6c 20 66 6f 72 6d 61 74 20 61 6e 64 20 73 6f 20  l format and so 
65f0: 77 65 20 68 61 64 20 74 6f 20 61 73 73 75 6d 65  we had to assume
6600: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 6d  .      ** the sm
6610: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
6620: 68 65 61 64 65 72 2e 20 20 4e 6f 77 20 77 65 20  header.  Now we 
6630: 6b 6e 6f 77 20 74 68 65 20 68 65 61 64 65 72 20  know the header 
6640: 69 73 20 62 69 67 67 65 72 0a 20 20 20 20 20 20  is bigger.      
6650: 2a 2a 20 74 68 61 6e 20 74 68 65 20 6d 69 6e 69  ** than the mini
6660: 6d 75 6d 20 73 6f 20 77 65 20 74 65 73 74 20 61  mum so we test a
6670: 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gain..      */. 
6680: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
6690: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
66a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
66b0: 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65  s(format, &pPage
66c0: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 2a 29 26 6e  r->jfd, (u32*)&n
66d0: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Rec);.    if( rc
66e0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
66f0: 62 61 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 72  back;.    rc = r
6700: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
6710: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
6720: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6730: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  it);.    if( rc 
6740: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
6750: 61 63 6b 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ack;.    if( nRe
6760: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 7c 7c  c==0xffffffff ||
6770: 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 20   useJournalSize 
6780: 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
6790: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
67a0: 44 52 5f 53 5a 28 33 29 29 2f 4a 4f 55 52 4e 41  DR_SZ(3))/JOURNA
67b0: 4c 5f 50 47 5f 53 5a 28 33 29 3b 0a 20 20 20 20  L_PG_SZ(3);.    
67c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
67d0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
67e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29 29 2f  RNAL_HDR_SZ(2))/
67f0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 32 29  JOURNAL_PG_SZ(2)
6800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
6810: 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
6820: 28 32 29 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  (2)+JOURNAL_HDR_
6830: 53 5a 28 32 29 3d 3d 73 7a 4a 20 29 3b 0a 20 20  SZ(2)==szJ );.  
6840: 7d 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  }.  rc = read32b
6850: 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61  its(format, &pPa
6860: 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78 50 67 29  ger->jfd, &mxPg)
6870: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
6890: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
68a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
68b0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
68c0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
68d0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
68e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
68f0: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
6900: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
6910: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
6920: 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  mxPg);.  if( rc!
6930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6940: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
6950: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
6960: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
6970: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
6980: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
6990: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
69a0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
69b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
69c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
69d0: 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
69e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
69f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
6a00: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
6a10: 2d 3e 6a 66 64 2c 20 66 6f 72 6d 61 74 29 3b 0a  ->jfd, format);.
6a20: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6a30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
6a40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
6a50: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
6a60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6a80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
6a90: 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20 68 61  /* Pages that ha
6aa0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
6ab0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  to the journal b
6ac0: 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a  ut never synced.
6ad0: 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72    ** where not r
6ae0: 65 73 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c  estored by the l
6af0: 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68  oop above.  We h
6b00: 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ave to restore t
6b10: 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hose.  ** pages 
6b20: 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20  by reading them 
6b30: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72  back from the or
6b40: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
6b50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6b60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6b70: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
6b80: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6b90: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6ba0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
6bb0: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
6bc0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6bd0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  ];.      if( !pP
6be0: 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  g->dirty ) conti
6bf0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
6c00: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
6c10: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
6c20: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
6c30: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
6c40: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
6c50: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
6c60: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
6c70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
6c80: 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67  liteOsRead(&pPag
6c90: 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51  er->fd, zBuf, SQ
6ca0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6cb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
6cc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6cd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
6ce0: 64 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dec ){.         
6cf0: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 28   pPager->xCodec(
6d00: 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
6d10: 67 2c 20 7a 42 75 66 2c 20 32 29 3b 0a 20 20 20  g, zBuf, 2);.   
6d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6d30: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
6d40: 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49  et(zBuf, 0, SQLI
6d50: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6d70: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
6d80: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
6d90: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
6da0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
6db0: 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ZE) ){.        m
6dc0: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
6dd0: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
6de0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6df0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6e00: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
6e10: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
6e20: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
6e30: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
6e40: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
6e50: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
6e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
6e70: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
6e80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6e90: 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  {.    pager_unwr
6ea0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6eb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
6ec0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
6ed0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
6ee0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
6ef0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
6f00: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
6f10: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
6f40: 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ack the checkpoi
6f50: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
6f60: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
6f70: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
6f80: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
6f90: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
6fa0: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
6fb0: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
6fc0: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
6fd0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
6fe0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6ff0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
7000: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
7010: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74  checkpoint is st
7020: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
7030: 63 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  ckptSize, not in
7040: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
7050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
7060: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
7070: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
7080: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
7090: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
70a0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
70b0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
70c0: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
70d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
70e0: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
70f0: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
7100: 73 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  set pPager->ckpt
7110: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
7120: 20 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f   int pager_ckpt_
7130: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
7140: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
7150: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
7160: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
7170: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
7180: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71a0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
71b0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
71e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
71f0: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
7200: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
7210: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
7220: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
7230: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
7240: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
7250: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
7260: 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 63  (off_t)pPager->c
7270: 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  kptSize);.  pPag
7280: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
7290: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a  ger->ckptSize;..
72a0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
72b0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
72c0: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
72d0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
72e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
72f0: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
7300: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
7310: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
7320: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
7330: 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 6e  r->cpfd, 0);.  n
7340: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  Rec = pPager->ck
7350: 70 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  ptNRec;.  .  /* 
7360: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
7370: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 63  ges out of the c
7380: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
7390: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
73a0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
73b0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
73c0: 61 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  at the checkpoin
73d0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73  t journal always
73e0: 20 75 73 65 73 20 66 6f 72 6d 61 74 0a 20 20 2a   uses format.  *
73f0: 2a 20 32 20 69 6e 73 74 65 61 64 20 6f 66 20 66  * 2 instead of f
7400: 6f 72 6d 61 74 20 33 20 73 69 6e 63 65 20 69 74  ormat 3 since it
7410: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
7420: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 77  o be concerned w
7430: 69 74 68 0a 20 20 2a 2a 20 70 6f 77 65 72 20 66  ith.  ** power f
7440: 61 69 6c 75 72 65 73 20 63 6f 72 72 75 70 74 69  ailures corrupti
7450: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
7460: 6e 64 20 63 61 6e 20 74 68 75 73 20 6f 6d 69 74  nd can thus omit
7470: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a   the checksums..
7480: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
7490: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
74a0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
74b0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
74c0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
74d0: 72 2d 3e 63 70 66 64 2c 20 32 29 3b 0a 20 20 20  r->cpfd, 2);.   
74e0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
74f0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
7500: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7510: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70  K ) goto end_ckp
7520: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
7530: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
7540: 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20   how many pages 
7550: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70 69 65  need to be copie
7560: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 72 61  d out of the tra
7570: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f  nsaction.  ** jo
7580: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63  urnal..  */.  rc
7590: 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28   = sqliteOsSeek(
75a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
75b0: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29  ager->ckptJSize)
75c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
75d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
75e0: 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62  o end_ckpt_playb
75f0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ack;.  }.  rc = 
7600: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
7610: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
7620: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
7630: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7640: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
7650: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e  layback;.  }.  n
7660: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
7670: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f  ger->ckptJSize)/
7680: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
7690: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
76a0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
76b0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
76c0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
76d0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
76e0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
76f0: 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  , journal_format
7700: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
7710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7720: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
7730: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
7740: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
7750: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
7760: 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 63 6b 70 74  .  }.  .end_ckpt
7770: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
7780: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7790: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
77a0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
77b0: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
77c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
77d0: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  UPT;.  }.  retur
77e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
77f0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
7800: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
7810: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
7820: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
7830: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
7840: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
7850: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
7860: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
7870: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
7880: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
7890: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
78a0: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
78b0: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
78c0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
78d0: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
78e0: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
78f0: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
7900: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
7910: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
7920: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
7930: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
7940: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
7950: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
7960: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
7970: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
7980: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
7990: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
79a0: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
79b0: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61  litepager_set_ca
79c0: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
79d0: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
79e0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
79f0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
7a00: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
7a10: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
7a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
7a30: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
7a40: 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50     mxPage = -mxP
7a50: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  age;.  }.  if( m
7a60: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
7a70: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
7a80: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a   mxPage;.  }.}..
7a90: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
7aa0: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
7ab0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
7ac0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
7ad0: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
7ae0: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
7af0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
7b00: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
7b10: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
7b20: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
7b30: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
7b40: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
7b50: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
7b60: 20 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 29    sqliteOsSync()
7b70: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
7b80: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
7b90: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
7ba0: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
7bb0: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
7bc0: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
7bd0: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
7be0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
7bf0: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
7c00: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
7c10: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
7c20: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
7c30: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
7c40: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
7c50: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
7c60: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
7c70: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
7c80: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
7c90: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
7cb0: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
7cc0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
7cd0: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
7ce0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
7cf0: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
7d00: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
7d10: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
7d20: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
7d30: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
7d40: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
7d50: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
7d60: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
7d70: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
7d80: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
7d90: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
7da0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
7db0: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
7dc0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
7dd0: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
7de0: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
7df0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
7e00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
7e10: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
7e20: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
7e30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7e40: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
7e50: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
7e60: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
7e70: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
7e80: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
7e90: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
7ea0: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
7eb0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
7ec0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
7ed0: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
7ee0: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
7ef0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
7f00: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
7f10: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
7f20: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
7f30: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
7f40: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
7f50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7f60: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
7f70: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
7f80: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
7f90: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
7fa0: 65 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  epager_set_safet
7fb0: 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  y_level(Pager *p
7fc0: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
7fd0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
7fe0: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
7ff0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
8000: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
8010: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
8020: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
8030: 65 6d 70 46 69 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  empFile;.}../*.*
8040: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
8050: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
8060: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8070: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
8080: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
8090: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
80a0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
80b0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
80c0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
80d0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
80e0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
80f0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
8100: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
8110: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
8120: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
8130: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
8140: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
8150: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
8160: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
8170: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
8180: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61  tic int sqlitepa
8190: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
81a0: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
81b0: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
81c0: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
81d0: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
81e0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d  .    sqliteOsTem
81f0: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
8200: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8210: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
8220: 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a  (zFile, fd, 1);.
8230: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
8240: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
8250: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
8260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
8270: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
8280: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
8290: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
82a0: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
82b0: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
82c0: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
82d0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
82e0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
82f0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
8300: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
8310: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
8320: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
8330: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
8340: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
8350: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
8360: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
8370: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
8380: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
8390: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
83a0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
83b0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
83c0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
83d0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
83e0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
83f0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
8400: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
8410: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8420: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8430: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
8440: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
8450: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8460: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
8470: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
8480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8490: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
84a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84b0: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
84c0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
84e0: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
84f0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
8500: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
8510: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
8520: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
8530: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
8540: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
8550: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
8560: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l           /* T
8570: 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c  RUE to use a rol
8580: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
8590: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
85a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
85b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
85c0: 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
85d0: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
85e0: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c 20 69   fd;.  int rc, i
85f0: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
8600: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
8610: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65   = 0;.  char zTe
8620: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
8630: 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70  ME_SIZE];..  *pp
8640: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  Pager = 0;.  if(
8650: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
8660: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
8670: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8680: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
8690: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
86a0: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 46 75  me[0] ){.    zFu
86b0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
86c0: 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  iteOsFullPathnam
86d0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
86e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
86f0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
8700: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
8710: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
8720: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
8730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
8740: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65   sqlitepager_ope
8750: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
8760: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
8770: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
8780: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
8790: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
87a0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
87b0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
87c0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
87d0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
87e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
87f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8800: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8810: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
8820: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
8830: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
8840: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
8850: 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20  ;.  }.  nameLen 
8860: 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61  = strlen(zFullPa
8870: 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  thname);.  pPage
8880: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
8890: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
88a0: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20  ) + nameLen*3 + 
88b0: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
88c0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
88d0: 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  iteOsClose(&fd);
88e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
88f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8900: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8910: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53  E_NOMEM;.  }.  S
8920: 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72 29  ET_PAGER(pPager)
8930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
8940: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
8950: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
8960: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
8970: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
8980: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
8990: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
89a0: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
89b0: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
89c0: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
89d0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
89e0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
89f0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
8a00: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
8a10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
8a20: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
8a30: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
8a40: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
8a50: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
8a60: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
8a70: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
8a80: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
8a90: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
8aa0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
8ab0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
8ac0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
8ad0: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
8ae0: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
8af0: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
8b00: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
8b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8b20: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  nalOpen = 0;.  p
8b30: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
8b40: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  l = useJournal;.
8b50: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
8b60: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
8b70: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b  ->ckptInUse = 0;
8b80: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
8b90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
8ba0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
8bb0: 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d  ager->ckptSize =
8bc0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b   0;.  pPager->ck
8bd0: 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  ptJSize = 0;.  p
8be0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
8bf0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
8c00: 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20  ge = mxPage>5 ? 
8c10: 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70  mxPage : 10;.  p
8c20: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
8c30: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  QLITE_UNLOCK;.  
8c40: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
8c50: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74  = 0;.  pPager->t
8c60: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
8c70: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  le;.  pPager->re
8c80: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
8c90: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
8ca0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
8cb0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
8cc0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
8cd0: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
8ce0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
8cf0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8d00: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
8d10: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
8d20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8d30: 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
8d40: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
8d50: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
8d60: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
8d70: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
8d80: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
8d90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8da0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
8db0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
8dc0: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
8dd0: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
8de0: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
8df0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
8e00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
8e10: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
8e20: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
8e30: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
8e40: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
8e50: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
8e60: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
8e70: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
8e80: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
8e90: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
8ea0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
8eb0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 70  a result sqlitep
8ec0: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
8ed0: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
8ee0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
8ef0: 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  y sqlitepager_un
8f00: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
8f10: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64  qlitepager_set_d
8f20: 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20  estructor(Pager 
8f30: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
8f40: 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a  xDesc)(void*)){.
8f50: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
8f60: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
8f70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8f80: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8f90: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
8fa0: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
8fb0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
8fc0: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
8fd0: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
8fe0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8ff0: 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61  {.  off_t n;.  a
9000: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
9010: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
9020: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
9030: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
9040: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
9050: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
9060: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
9070: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
9080: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
9090: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
90a0: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
90b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
90c0: 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   /= SQLITE_PAGE_
90d0: 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67  SIZE;.  if( pPag
90e0: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
90f0: 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_UNLOCK ){.    
9100: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
9110: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
9120: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72   n;.}../*.** For
9130: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
9140: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9150: 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
9160: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  *);../*.** Trunc
9170: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
9180: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
9190: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
91a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
91b0: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
91c0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
91d0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
91e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
91f0: 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73  bSize<0 ){.    s
9200: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63  qlitepager_pagec
9210: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
9220: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
9230: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
9240: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
9250: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
9260: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
9270: 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
9280: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
9290: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
92a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
92b0: 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61    }.  syncJourna
92c0: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  l(pPager);.  rc 
92d0: 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  = sqliteOsTrunca
92e0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
92f0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
9300: 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a  *(off_t)nPage);.
9310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9320: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
9330: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
9340: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9350: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
9360: 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
9370: 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
9380: 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
9390: 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
93a0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
93b0: 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
93c0: 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
93d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
93e0: 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
93f0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
9400: 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
9410: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
9420: 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
9430: 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
9440: 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
9450: 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
9460: 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
9470: 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
9480: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
9490: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
94a0: 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
94b0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
94c0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73  redump..*/.int s
94d0: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
94e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
94f0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
9500: 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
9510: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
9520: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
9530: 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20  E_WRITELOCK: {. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
9550: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
9560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  );.      sqliteO
9570: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
9580: 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
9590: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
95a0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
95b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
95c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
95d0: 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20  _READLOCK: {.   
95e0: 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63     sqliteOsUnloc
95f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
9600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9610: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
9620: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
9630: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
9640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9650: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
9660: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
9670: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
9680: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
9690: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
96a0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73  ee(pPg);.  }.  s
96b0: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50  qliteOsClose(&pP
96c0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73  ager->fd);.  ass
96d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
96e0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
96f0: 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
9700: 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
9710: 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
9720: 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
9730: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
9740: 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44    **   sqliteOsD
9750: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
9760: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
9770: 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45  .  */.  CLR_PAGE
9780: 52 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  R(pPager);.  if(
9790: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
97a0: 6d 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67  me!=(char*)&pPag
97b0: 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73  er[1] ){.    ass
97c0: 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
97d0: 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
97e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
97f0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
9800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
9810: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
9820: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
9830: 65 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ee(pPager->zDire
9840: 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71  ctory);.  }.  sq
9850: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
9860: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9870: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
9880: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
9890: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
98a0: 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
98b0: 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70 61 67  /.Pgno sqlitepag
98c0: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f  er_pagenumber(vo
98d0: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
98e0: 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f  Hdr *p = DATA_TO
98f0: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
9900: 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
9910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
9920: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
9930: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
9940: 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
9950: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
9960: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9970: 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
9980: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
9990: 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
99a0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
99b0: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  st..*/.#define p
99c0: 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
99d0: 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
99e0: 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
99f0: 29 2d 3e 6e 52 65 66 2b 2b 29 0a 73 74 61 74 69  )->nRef++).stati
9a00: 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
9a10: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
9a20: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
9a30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
9a40: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
9a50: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9a60: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
9a70: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
9a80: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
9a90: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
9aa0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
9ab0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
9ac0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
9ad0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
9ae0: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
9af0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
9b00: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
9b10: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
9b20: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
9b30: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
9b40: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
9b50: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
9b60: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
9b70: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
9b80: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
9b90: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
9ba0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
9bb0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
9bc0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
9bd0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
9be0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
9bf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9c00: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
9c10: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
9c20: 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
9c30: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
9c40: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
9c50: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
9c60: 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  FO(pPg);.}../*.*
9c70: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
9c80: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
9c90: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
9ca0: 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
9cb0: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
9cc0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
9cd0: 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
9ce0: 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a  pager_ref(void *
9cf0: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
9d00: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
9d10: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70  GHDR(pData);.  p
9d20: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
9d30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
9d50: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
9d60: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
9d70: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
9d80: 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
9d90: 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
9da0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
9db0: 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
9dc0: 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
9dd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
9de0: 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
9df0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
9e00: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
9e10: 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
9e20: 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
9e30: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
9e40: 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
9e50: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
9e60: 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
9e70: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
9e80: 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
9e90: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
9ea0: 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
9eb0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
9ec0: 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
9ed0: 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
9ee0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
9ef0: 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
9f00: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9f10: 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
9f20: 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
9f30: 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
9f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9f50: 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
9f60: 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
9f70: 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
9f80: 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
9f90: 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
9fa0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
9fb0: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
9fc0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
9fd0: 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
9fe0: 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
9ff0: 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
a000: 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
a010: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
a020: 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
a030: 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
a040: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
a050: 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
a060: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
a070: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
a080: 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
a090: 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
a0a0: 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
a0b0: 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
a0c0: 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
a0d0: 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
a0e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
a0f0: 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
a100: 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
a110: 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
a120: 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
a130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a140: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
a150: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
a160: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
a170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a180: 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
a190: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
a1a0: 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
a1b0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
a1c0: 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
a1d0: 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
a1e0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
a1f0: 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
a200: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
a210: 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
a220: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
a230: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a240: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a250: 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 61  lOpen );.      a
a260: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
a270: 6e 6f 53 79 6e 63 20 29 3b 0a 23 69 66 6e 64 65  noSync );.#ifnde
a280: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
a290: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
a2a0: 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
a2b0: 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
a2c0: 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
a2d0: 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
a2e0: 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
a2f0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a300: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
a310: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
a320: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66    */.        off
a330: 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20  _t hdrSz, pgSz, 
a340: 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72  jSz;.        hdr
a350: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  Sz = JOURNAL_HDR
a360: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
a370: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53  at);.        pgS
a380: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  z = JOURNAL_PG_S
a390: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
a3a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
a3b0: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
a3c0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
a3d0: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
a3e0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
a3f0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
a410: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
a420: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
a430: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  dif.      if( jo
a440: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20  urnal_format>=3 
a450: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
a460: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
a470: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
a480: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  nal file header 
a490: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
a4a0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
a4b0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
a4c0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
a4d0: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
a4e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a4f0: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
a500: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
a510: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
a520: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a540: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
a550: 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f  ager->jfd, sizeo
a560: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
a570: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
a580: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
a590: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a5a0: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
a5b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a5c0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 7a  n rc;.        sz
a5d0: 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J = JOURNAL_HDR_
a5e0: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
a5f0: 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  t) +.           
a600: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
a610: 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
a620: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
a630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a640: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
a650: 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20  jfd, szJ);.     
a660: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 31 28   }.      TRACE1(
a670: 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20  "SYNC\n");.     
a680: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79   rc = sqliteOsSy
a690: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
a6a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
a6b0: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
a6c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
a6d0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
a6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
a6f0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
a700: 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
a710: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
a720: 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
a730: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
a740: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
a750: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
a760: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
a770: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
a780: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
a790: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a7a0: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
a7b0: 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
a7c0: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
a7d0: 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
a7e0: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
a7f0: 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
a800: 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
a810: 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
a820: 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
a830: 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
a840: 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
a850: 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
a860: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
a870: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a880: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a890: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
a8a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a8b0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
a8c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
a8d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
a8e0: 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
a8f0: 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
a900: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
a910: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
a920: 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
a930: 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
a940: 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
a950: 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
a960: 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
a970: 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
a980: 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
a990: 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
a9a0: 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
a9b0: 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
a9c0: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
a9d0: 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
a9e0: 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
a9f0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
aa00: 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
aa10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
aa20: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
aa30: 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
aa40: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
aa50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
aa60: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
aa70: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
aa80: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
aa90: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
aaa0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
aab0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
aac0: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 29  pPager->xCodec )
aad0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
aae0: 78 43 6f 64 65 63 28 70 50 61 67 65 72 2d 3e 70  xCodec(pPager->p
aaf0: 43 6f 64 65 63 41 72 67 2c 20 50 47 48 44 52 5f  CodecArg, PGHDR_
ab00: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
ab10: 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  6);.    }.    rc
ab20: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
ab30: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
ab40: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
ab50: 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  t), SQLITE_PAGE_
ab60: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 70  SIZE);.    if( p
ab70: 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 29 7b  Pager->xCodec ){
ab80: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
ab90: 43 6f 64 65 63 28 70 50 61 67 65 72 2d 3e 70 43  Codec(pPager->pC
aba0: 6f 64 65 63 41 72 67 2c 20 50 47 48 44 52 5f 54  odecArg, PGHDR_T
abb0: 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 30  O_DATA(pList), 0
abc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
abd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
abe0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
abf0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  y = 0;.    pList
ac00: 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
ac10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
ac20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ac30: 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
ac40: 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
ac50: 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
ac60: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
ac70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
ac80: 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
ac90: 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
aca0: 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
acb0: 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
acc0: 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
acd0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
ace0: 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
acf0: 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
ad00: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
ad10: 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73  , *pList;.  pLis
ad20: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  t = 0;.  for(p=p
ad30: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
ad40: 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
ad50: 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79      if( p->dirty
ad60: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69   ){.      p->pDi
ad70: 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  rty = pList;.   
ad80: 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20     pList = p;.  
ad90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ada0: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
adb0: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
adc0: 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
add0: 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
ade0: 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
adf0: 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
ae00: 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
ae10: 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
ae20: 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
ae30: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
ae40: 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
ae50: 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
ae60: 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
ae70: 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
ae80: 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
ae90: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
aea0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
aeb0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
aec0: 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
aed0: 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
aee0: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
aef0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
af00: 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
af10: 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
af20: 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
af30: 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
af40: 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
af50: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
af60: 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
af70: 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
af80: 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
af90: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
afa0: 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
afb0: 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
afc0: 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
afd0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
afe0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
aff0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
b000: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
b010: 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
b020: 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
b030: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f  o sqlitepager_lo
b040: 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
b050: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
b060: 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
b070: 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
b080: 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
b090: 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
b0a0: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
b0b0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
b0c0: 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
b0d0: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
b0e0: 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
b0f0: 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
b100: 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
b110: 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
b120: 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
b130: 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
b140: 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
b150: 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
b160: 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
b170: 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
b180: 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
b190: 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
b1a0: 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
b1b0: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
b1c0: 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
b1d0: 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
b1e0: 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
b1f0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
b200: 65 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  epager_get(Pager
b210: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
b220: 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
b230: 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
b240: 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
b250: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
b260: 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
b270: 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
b280: 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
b290: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
b2a0: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
b2b0: 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
b2c0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
b2d0: 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
b2e0: 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
b2f0: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
b300: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
b310: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
b320: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
b330: 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
b340: 74 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20  then get a read 
b350: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
b360: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
b370: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
b380: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
b390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
b3a0: 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
b3b0: 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  >fd);.    if( rc
b3c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
b3e0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
b3f0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
b400: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20  _READLOCK;..    
b410: 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
b420: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79  file exists, try
b430: 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
b440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b450: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
b460: 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f 73 46  nal && sqliteOsF
b470: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
b480: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  ->zJournal) ){. 
b490: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
b4a0: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77        /* Get a w
b4b0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
b4c0: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
b4d0: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
b4e0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63  sqliteOsWriteLoc
b4f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
b500: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
b510: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b520: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f       if( sqliteO
b530: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
b540: 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  >fd)!=SQLITE_OK 
b550: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){.           /*
b560: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
b570: 65 72 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20  er happen! */.  
b580: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
b590: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
b5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b5b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
b5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
b5d0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
b5e0: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
b5f0: 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
b600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
b610: 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52  reading only.  R
b620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
b630: 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
b640: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
b650: 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
b660: 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
b670: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  *.       ** The 
b680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
b690: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
b6a0: 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
b6b0: 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a   The.       ** j
b6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b6d0: 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
b6e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
b6f0: 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
b700: 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
b710: 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
b720: 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
b730: 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
b740: 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e.       ** proc
b750: 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
b760: 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
b770: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
b780: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
b790: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65  = sqliteOsOpenRe
b7a0: 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
b7b0: 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
b7c0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69  ->jfd);.       i
b7d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20   ){.         rc 
b7f0: 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b  = sqliteOsUnlock
b800: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
b810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
b830: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
b840: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
b850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
b860: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b870: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
b880: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
b890: 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  rted = 0;..     
b8a0: 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
b8b0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
b8c0: 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
b8d0: 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
b8e0: 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
b8f0: 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
b900: 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
b910: 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
b920: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b930: 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
b940: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
b970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
b980: 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
b990: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
b9a0: 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
b9b0: 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
b9c0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
b9d0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
b9e0: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
b9f0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
ba00: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
ba10: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
ba20: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
ba30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73      pPager->nMis
ba40: 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  s++;.    if( pPa
ba50: 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
ba60: 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
ba70: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29  ger->pFirst==0 )
ba80: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
ba90: 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
baa0: 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
bab0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
bac0: 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49  eof(*pPg) + SQLI
bad0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  TE_PAGE_SIZE .  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
bb00: 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
bb10: 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20  er->nExtra );.  
bb20: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
bb30: 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
bb40: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
bb50: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
bb60: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
bb70: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
bb80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bba0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
bbb0: 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
bbc0: 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 70 50  *pPg));.      pP
bbd0: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
bbe0: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
bbf0: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
bc00: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66  ->pAll;.      if
bc10: 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
bc20: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
bc30: 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c  ->pAll->pPrevAll
bc40: 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a   = pPg;.      }.
bc50: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
bc60: 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  All = 0;.      p
bc70: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
bc80: 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
bc90: 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65  >nPage++;.    }e
bca0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  lse{.      /* Fi
bcb0: 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
bcc0: 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
bcd0: 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
bce0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
bcf0: 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
bd00: 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
bd10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
bd20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
bd30: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
bd40: 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20  stSynced;..     
bd50: 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
bd60: 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
bd70: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
bd80: 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
bd90: 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
bda0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
bdb0: 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
bdc0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
bdd0: 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76   is a.      ** v
bde0: 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
bdf0: 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
be00: 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
be10: 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
be20: 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27        ** it can'
be30: 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20  t be helped..   
be40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
be50: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
be60: 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
be70: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
be80: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
be90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
bea0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
beb0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
bec0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bed0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
bee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
bef0: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
bf00: 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
bf10: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
bf20: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
bf30: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
bf40: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
bf50: 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
bf60: 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
bf70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
bf80: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
bf90: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
bfa0: 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
bfb0: 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
bfc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
bfd0: 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
bfe0: 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
bff0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c000: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67         sqlitepag
c020: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
c030: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
c040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c050: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
c060: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
c070: 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
c080: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 );..      /* I
c090: 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
c0a0: 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
c0b0: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
c0c0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
c0d0: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67      ** set the g
c0e0: 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
c0f0: 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
c100: 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
c110: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f      ** sqlite_do
c120: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
c130: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
c140: 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
c150: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
c160: 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65     ** It is nece
c170: 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
c180: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
c190: 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
c1a0: 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
c1b0: 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
c1c0: 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
c1d0: 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
c1e0: 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
c1f0: 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  member.      ** 
c200: 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
c210: 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
c220: 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
c230: 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
c240: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d  st.      ** be m
c250: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
c260: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
c270: 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20  e on out..      
c280: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
c290: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
c2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
c2b0: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
c2c0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
c2d0: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b  .      /* Unlink
c2e0: 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
c2f0: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
c300: 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
c310: 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
c320: 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
c330: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
c340: 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64   ){.        PgHd
c350: 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
c360: 74 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 77  tFree;.        w
c370: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
c380: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
c390: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
c3a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
c3b0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
c3c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c3d0: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
c3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
c3f0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
c400: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
c410: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65  xtFree;.      }e
c420: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
c430: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
c440: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
c450: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
c460: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
c470: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
c480: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
c490: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  tFree ){.       
c4a0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
c4b0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
c4c0: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
c4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c4f0: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
c500: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c510: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
c520: 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  evFree;.      }.
c530: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
c540: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
c550: 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  vFree = 0;.     
c560: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
c570: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
c580: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
c590: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
c5a0: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20  pPrevHash;.     
c5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
c5c0: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
c5d0: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
c5e0: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
c5f0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
c600: 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  h;.      }else{.
c610: 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65          h = page
c620: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
c630: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c640: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
c650: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
c660: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
c670: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
c680: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  tHash;.      }. 
c690: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
c6a0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
c6b0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
c6c0: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
c6d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
c6e0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
c6f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
c700: 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
c710: 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
c720: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
c730: 20 20 73 71 6c 69 74 65 43 68 65 63 6b 4d 65 6d    sqliteCheckMem
c740: 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
c750: 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
c760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c770: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c780: 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
c790: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
c7a0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
c7b0: 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
c7c0: 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
c7d0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
c7e0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
c7f0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
c800: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c810: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
c820: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
c830: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  f( pPager->aInCk
c840: 70 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  pt && (int)pgno<
c850: 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a  =pPager->ckptSiz
c860: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
c870: 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  & (pPager->aInCk
c880: 70 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  pt[pgno/8] & (1<
c890: 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
c8a0: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
c8b0: 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73 74 28 70 50  _to_ckpt_list(pP
c8c0: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
c8d0: 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
c8e0: 5f 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28  _from_ckpt_list(
c8f0: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
c900: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
c910: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
c920: 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
c930: 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
c940: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
c950: 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
c960: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
c970: 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
c980: 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
c990: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
c9a0: 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
c9b0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
c9c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c9d0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
c9e0: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
c9f0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
ca00: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
ca10: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
ca20: 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
ca30: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
ca40: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
ca50: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
ca60: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
ca70: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
ca80: 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71  r->dbSize<0 ) sq
ca90: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
caa0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
cab0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
cac0: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
cad0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
cae0: 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
caf0: 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
cb00: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
cb10: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
cb20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
cb30: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
cb40: 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e  >dbSize<(int)pgn
cb50: 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
cb60: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
cb70: 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f  pPg), 0, SQLITE_
cb80: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
cb90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
cba0: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
cbb0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
cbc0: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
cbd0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
cbe0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
cbf0: 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28   = sqliteOsRead(
cc00: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
cc10: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
cc20: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
cc30: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  E);.      if( rc
cc40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cc50: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
cc60: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
cc70: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53  f( sqliteOsFileS
cc80: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
cc90: 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
cca0: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
ccb0: 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
ccc0: 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41  >=pgno*SQLITE_PA
ccd0: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
cce0: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
ccf0: 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
cd00: 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
cd10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
cd20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
cd30: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
cd40: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
cd50: 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50  Pg), 0, SQLITE_P
cd60: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
cd70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cd80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
cd90: 64 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dec ){.        p
cda0: 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 28 70 50  Pager->xCodec(pP
cdb0: 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ager->pCodecArg,
cdc0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
cdd0: 50 67 29 2c 20 33 29 3b 0a 20 20 20 20 20 20 7d  Pg), 3);.      }
cde0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
cdf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
ce00: 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
ce10: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
ce20: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
ce30: 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
ce40: 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
ce50: 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
ce60: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
ce70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ce80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
ce90: 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
cea0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
ceb0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
cec0: 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
ced0: 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
cee0: 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
cef0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cf00: 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
cf10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
cf20: 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
cf30: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
cf40: 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
cf50: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
cf60: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
cf70: 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70  e.** and sqlitep
cf80: 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
cf90: 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
cfa0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
cfb0: 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
cfc0: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
cfd0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
cfe0: 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
cff0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
d000: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
d010: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
d020: 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
d030: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
d040: 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
d050: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
d060: 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50  tepager_lookup(P
d070: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
d080: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
d090: 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
d0a0: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
d0b0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
d0c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d0d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50  r->errMask & ~(P
d0e0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29  AGER_ERR_FULL) )
d0f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d100: 20 20 7d 0a 20 20 2f 2a 20 69 66 28 20 70 50 61    }.  /* if( pPa
d110: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
d120: 20 20 2a 2a 20 20 72 65 74 75 72 6e 20 30 3b 0a    **  return 0;.
d130: 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 70 50    ** }.  */.  pP
d140: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
d150: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
d160: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
d170: 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
d180: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
d190: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
d1a0: 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
d1b0: 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
d1c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
d1d0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
d1e0: 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
d1f0: 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
d200: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
d210: 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
d220: 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
d230: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
d240: 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
d250: 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
d260: 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
d270: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
d280: 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
d290: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
d2a0: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
d2b0: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
d2c0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
d2d0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d2e0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
d2f0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
d300: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41   */.  pPg = DATA
d310: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
d320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
d330: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
d340: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
d350: 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  NFO(pPg);..  /* 
d360: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
d370: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
d380: 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
d390: 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
d3a0: 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
d3b0: 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
d3c0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
d3d0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
d3e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
d3f0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
d400: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
d410: 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
d420: 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
d430: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
d440: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
d450: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
d460: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
d470: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
d480: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
d490: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
d4a0: 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
d4b0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
d4c0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
d4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d4e0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
d4f0: 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
d500: 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
d510: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
d520: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
d530: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
d540: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
d550: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
d560: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
d570: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Data);.    }.  .
d580: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
d590: 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
d5a0: 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
d5b0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
d5c0: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
d5d0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
d5e0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
d5f0: 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
d600: 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
d610: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
d620: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
d630: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
d640: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
d650: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
d660: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d670: 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
d680: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
d690: 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
d6a0: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
d6b0: 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  write.** lock on
d6c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d6d0: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
d6e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d6f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
d700: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
d710: 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
d720: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
d730: 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
d740: 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
d750: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
d760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d770: 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
d780: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
d790: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
d7a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
d7b0: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49  tate==SQLITE_WRI
d7c0: 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  TELOCK );.  asse
d7d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
d7e0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
d7f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d800: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
d810: 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65  sqlitepager_page
d820: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
d830: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
d840: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
d850: 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
d860: 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
d870: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
d880: 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rnal==0 ){.    s
d890: 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28  qliteOsReadLock(
d8a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
d8b0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d8c0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  = SQLITE_READLOC
d8d0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
d8e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
d900: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
d910: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
d920: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
d930: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
d940: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d950: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
d960: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
d970: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
d980: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
d990: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
d9a0: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
d9b0: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
d9c0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
d9d0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
d9e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d9f0: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
da00: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 44 69 72 65  sqliteOsOpenDire
da10: 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44  ctory(pPager->zD
da20: 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65  irectory, &pPage
da30: 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65  r->jfd);.  pPage
da40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
da50: 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
da60: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
da70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
da80: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
da90: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
daa0: 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
dab0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
dac0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
dad0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
dae0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
daf0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
db00: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
db10: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
db20: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
db30: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
db40: 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f  format==JOURNAL_
db50: 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20  FORMAT_3 ){.    
db60: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
db70: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
db80: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c   aJournalMagic3,
db90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
dba0: 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20 69 66  Magic3));.    if
dbb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dbc0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  ){.      rc = wr
dbd0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
dbe0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
dbf0: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
dc00: 66 66 66 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  fff : 0);.    }.
dc10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dc20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
dc30: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
dc40: 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 52 61   = (u32)sqliteRa
dc50: 6e 64 6f 6d 49 6e 74 65 67 65 72 28 29 3b 0a 20  ndomInteger();. 
dc60: 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
dc70: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
dc80: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  fd, pPager->cksu
dc90: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20  mInit);.    }.  
dca0: 7d 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e 61  }else if( journa
dcb0: 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41  l_format==JOURNA
dcc0: 4c 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20 20  L_FORMAT_2 ){.  
dcd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
dce0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
dcf0: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
dd00: 32 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  2, sizeof(aJourn
dd10: 61 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20 7d 65  alMagic2));.  }e
dd20: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
dd30: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d   journal_format=
dd40: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
dd50: 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
dd60: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
dd70: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
dd80: 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66  alMagic1, sizeof
dd90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29  (aJournalMagic1)
dda0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
ddb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ddc0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
ddd0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
dde0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
ddf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
de00: 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e  er->ckptAutoopen
de10: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
de20: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
de30: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62  litepager_ckpt_b
de40: 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
de50: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
de60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
de70: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
de80: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
de90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dea0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
deb0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
dec0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ded0: 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc;  .}../*.** 
dee0: 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
def0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
df00: 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
df10: 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
df20: 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
df30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
df40: 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
df50: 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69  qlitepager_commi
df60: 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
df70: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67  *   *  sqlitepag
df80: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
df90: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
dfa0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f   sqlitepager_clo
dfb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dfc0: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
dfd0: 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
dfe0: 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
dff0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
e000: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
e010: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
e020: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
e030: 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
e040: 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
e050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
e060: 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
e070: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
e080: 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
e090: 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65  ly.** to acquire
e0a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
e0b0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e0c0: 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
e0d0: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hat there.** is 
e0e0: 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
e0f0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
e100: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ase..**.** A jou
e110: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
e120: 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
e130: 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
e140: 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d  ile.  For.** tem
e150: 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
e160: 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
e170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
e180: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 0a   deferred until.
e190: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  ** there is an a
e1a0: 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
e1b0: 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
e1c0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
e1d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
e1e0: 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65  eady write-locke
e1f0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
e200: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
e210: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 62  nt sqlitepager_b
e220: 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61  egin(void *pData
e230: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
e240: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
e250: 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
e260: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
e270: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
e280: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
e290: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
e2a0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
e2b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
e2c0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  QLITE_UNLOCK );.
e2d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e2e0: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44  ate==SQLITE_READ
e2f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
e300: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
e310: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
e320: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
e330: 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  iteLock(&pPager-
e340: 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  >fd);.    if( rc
e350: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e360: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
e380: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
e390: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20  _WRITELOCK;.    
e3a0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
e3b0: 65 20 3d 20 30 3b 0a 20 20 20 20 54 52 41 43 45  e = 0;.    TRACE
e3c0: 31 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 5c 6e  1("TRANSACTION\n
e3d0: 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ");.    if( pPag
e3e0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
e3f0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e400: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
e410: 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
e420: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
e430: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
e450: 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
e460: 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
e470: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
e480: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e490: 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
e4a0: 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
e4b0: 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
e4c0: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
e4d0: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
e4e0: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
e4f0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
e500: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
e510: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
e520: 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
e530: 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
e540: 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
e550: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
e560: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
e570: 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  If the write.** 
e580: 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
e590: 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
e5a0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
e5b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
e5c0: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
e5d0: 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
e5e0: 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
e5f0: 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
e600: 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
e610: 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
e620: 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
e630: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
e640: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
e650: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
e660: 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
e670: 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
e680: 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
e690: 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
e6a0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
e6b0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
e6c0: 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
e6d0: 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
e6e0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
e6f0: 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
e700: 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
e710: 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
e720: 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
e730: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  o sqlitepager_co
e740: 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
e750: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
e760: 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
e770: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
e780: 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
e790: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
e7a0: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
e7b0: 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
e7c0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
e7d0: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
e7e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e7f0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
e800: 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
e810: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e820: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
e830: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
e840: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
e850: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
e860: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
e870: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
e880: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
e890: 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
e8a0: 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
e8b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
e8c0: 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
e8d0: 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
e8e0: 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
e8f0: 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
e900: 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
e910: 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
e920: 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 43  nal && (pPg->inC
e930: 6b 70 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  kpt || pPager->c
e940: 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  kptInUse==0) ){.
e950: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
e960: 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72  yFile = 1;.    r
e970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
e990: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
e9a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
e9b0: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
e9c0: 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
e9d0: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
e9e0: 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
e9f0: 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
ea00: 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
ea10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
ea20: 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
ea30: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
ea40: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
ea50: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
ea60: 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
ea70: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
ea80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
ea90: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
eaa0: 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  K );.  rc = sqli
eab0: 74 65 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  tepager_begin(pD
eac0: 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
ead0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
eaf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
eb00: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
eb10: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 69  WRITELOCK );.  i
eb20: 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
eb30: 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
eb40: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
eb50: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
eb60: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
eb70: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
eb80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
eb90: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
eba0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ebb0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
ebc0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
ebd0: 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  l );.  pPager->d
ebe0: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 0a 20  irtyFile = 1;.. 
ebf0: 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
ec00: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
ec10: 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
ec20: 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ve a write lock 
ec30: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e  on the.  ** main
ec40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ec50: 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
ec60: 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 74  nt page to the t
ec70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
ec80: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
ec90: 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
eca0: 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ady..  */.  if( 
ecb0: 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
ecc0: 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
ecd0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 66 28  urnal ){.    if(
ece0: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
ecf0: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
ed00: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  bSize ){.      i
ed10: 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75  nt szPg;.      u
ed20: 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  32 saved;.      
ed30: 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  if( journal_form
ed40: 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  at>=JOURNAL_FORM
ed50: 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20  AT_3 ){.        
ed60: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  u32 cksum = page
ed70: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
ed80: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
ed90: 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64  );.        saved
eda0: 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f   = *(u32*)PGHDR_
edb0: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20  TO_EXTRA(pPg);. 
edc0: 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
edd0: 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53  ts(cksum, pPg, S
ede0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
edf0: 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  ;.        szPg =
ee00: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
ee10: 45 2b 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  E+8;.      }else
ee20: 7b 0a 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d  {.        szPg =
ee30: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
ee40: 45 2b 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E+4;.      }.   
ee50: 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
ee60: 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
ee70: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  4);.      if( pP
ee80: 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 29 7b 0a  ager->xCodec ){.
ee90: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
eea0: 78 43 6f 64 65 63 28 70 50 61 67 65 72 2d 3e 70  xCodec(pPager->p
eeb0: 43 6f 64 65 63 41 72 67 2c 20 70 44 61 74 61 2c  CodecArg, pData,
eec0: 20 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   3);.      }.   
eed0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
eee0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
eef0: 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
ef00: 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
ef10: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
ef20: 2d 3e 78 43 6f 64 65 63 20 29 7b 0a 20 20 20 20  ->xCodec ){.    
ef30: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
ef40: 65 63 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ec(pPager->pCode
ef50: 63 41 72 67 2c 20 70 44 61 74 61 2c 20 30 29 3b  cArg, pData, 0);
ef60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ef70: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
ef80: 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t>=JOURNAL_FORMA
ef90: 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  T_3 ){.        *
efa0: 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
efb0: 58 54 52 41 28 70 50 67 29 20 3d 20 73 61 76 65  XTRA(pPg) = save
efc0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
efd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
efe0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
eff0: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
f000: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
f010: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
f020: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
f030: 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72  _FULL;.        r
f040: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f050: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
f060: 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nRec++;.      as
f070: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
f080: 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
f090: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
f0a0: 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
f0b0: 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
f0c0: 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
f0d0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
f0e0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
f0f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
f100: 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
f110: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
f120: 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
f130: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
f140: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
f150: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
f160: 37 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  7);.        page
f170: 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73  _add_to_ckpt_lis
f180: 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pPg);.      }.
f190: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
f1a0: 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c 20  URNAL %d %d\n", 
f1b0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
f1c0: 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
f1d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
f1e0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
f1f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
f200: 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
f210: 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52  noSync;.      TR
f220: 41 43 45 33 28 22 41 50 50 45 4e 44 20 25 64 20  ACE3("APPEND %d 
f230: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
f240: 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
f250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f260: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
f270: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
f280: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
f290: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f2a0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
f2b0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
f2c0: 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
f2d0: 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74  ot in it,.  ** t
f2e0: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
f2f0: 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
f300: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
f310: 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
f320: 0a 20 20 2a 2a 20 74 68 65 20 63 68 65 63 6b 70  .  ** the checkp
f330: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77  oint journal alw
f340: 61 79 73 20 75 73 65 73 20 74 68 65 20 73 69 6d  ays uses the sim
f350: 70 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20 74  plier format 2 t
f360: 68 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20 63  hat lacks.  ** c
f370: 68 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20 68  hecksums.  The h
f380: 65 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f 6d  eader is also om
f390: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63  itted from the c
f3a0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
f3b0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
f3c0: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
f3d0: 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20  && !pPg->inCkpt 
f3e0: 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
f3f0: 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  o<=pPager->ckptS
f400: 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
f410: 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
f420: 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
f430: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
f440: 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 74  DbSize );.    st
f450: 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
f460: 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
f470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
f480: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 63  Write(&pPager->c
f490: 70 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44  pfd, &((char*)pD
f4a0: 61 74 61 29 5b 2d 34 5d 2c 20 53 51 4c 49 54 45  ata)[-4], SQLITE
f4b0: 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20  _PAGE_SIZE+4);. 
f4c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f4d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f4e0: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
f4f0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
f500: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
f510: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
f520: 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ULL;.      retur
f530: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f540: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
f550: 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
f560: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21  pPager->aInCkpt!
f570: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
f580: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
f590: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
f5a0: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
f5b0: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74  page_add_to_ckpt
f5c0: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
f5d0: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
f5e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
f5f0: 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
f600: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
f610: 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
f620: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
f630: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
f640: 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
f650: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f660: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f670: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
f680: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
f690: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
f6a0: 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
f6b0: 65 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20  epager_write(). 
f6c0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f6d0: 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
f6e0: 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
f6f0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
f700: 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
f710: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
f720: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f  r_iswriteable(vo
f730: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
f740: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
f750: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
f760: 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
f770: 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
f780: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
f790: 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
f7a0: 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
f7b0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
f7c0: 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
f7d0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
f7e0: 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
f7f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
f800: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
f810: 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
f820: 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
f830: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  ..  rc = sqlitep
f840: 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
f850: 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
f860: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f870: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
f880: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
f890: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
f8a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f8b0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
f8c0: 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51  pPage, pData, SQ
f8d0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
f8e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f8f0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  epager_unref(pPa
f900: 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
f910: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
f920: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
f930: 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
f940: 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
f950: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
f960: 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
f970: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
f980: 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74  ge "pgno" back t
f990: 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
f9a0: 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
f9b0: 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
f9c0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
f9d0: 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
f9e0: 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
f9f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
fa00: 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
fa10: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
fa20: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
fa30: 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
fa40: 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
fa50: 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
fa60: 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
fa70: 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
fa80: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
fa90: 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
faa0: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
fab0: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
fac0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 70 61 67  the.** sqlitepag
fad0: 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
fae0: 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
faf0: 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
fb00: 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
fb10: 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
fb20: 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
fb30: 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
fb40: 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
fb50: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
fb60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
fb70: 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
fb80: 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
fb90: 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
fba0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
fbb0: 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  tepager_dont_rol
fbc0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
fbd0: 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
fbe0: 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
fbf0: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
fc00: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
fc10: 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
fc20: 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
fc30: 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
fc40: 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
fc50: 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
fc60: 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
fc70: 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
fc80: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
fc90: 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
fca0: 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
fcb0: 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
fcc0: 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
fcd0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
fce0: 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
fcf0: 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
fd00: 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
fd10: 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
fd20: 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
fd30: 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
fd40: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
fd50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fd60: 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
fd70: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
fd80: 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61  s.** critical da
fd90: 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
fda0: 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
fdb0: 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  gets rolled back
fdc0: 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20   in spite.** of 
fdd0: 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
fde0: 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
fdf0: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f  d sqlitepager_do
fe00: 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
fe10: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
fe20: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
fe30: 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
fe40: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
fe50: 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  pgno);.  pPg->al
fe60: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
fe70: 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70  ;.  if( pPg && p
fe80: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
fe90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
fea0: 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
feb0: 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
fec0: 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
fed0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
fee0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
fef0: 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
ff00: 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
ff10: 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
ff20: 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
ff30: 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
ff40: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
ff50: 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
ff60: 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
ff70: 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
ff80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
ff90: 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
ffa0: 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
ffb0: 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
ffc0: 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
ffd0: 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
ffe0: 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
fff0: 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
10000 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
10010 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
10020 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
10030 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
10040 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
10050 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
10060 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
10070 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
10080 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
10090 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
100a0 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
100b0 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
100c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
100d0 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
100e0 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 44  .      TRACE2("D
100f0 4f 4e 54 5f 57 52 49 54 45 20 25 64 5c 6e 22 2c  ONT_WRITE %d\n",
10100 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50   pgno);.      pP
10110 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
10120 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10130 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
10140 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
10150 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
10160 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
10170 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
10180 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
10190 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
101a0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
101b0 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
101c0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
101d0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
101e0 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
101f0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
10200 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
10210 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10220 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
10230 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
10240 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
10250 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
10260 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
10270 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10280 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
10290 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
102a0 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20  TE_WRITELOCK || 
102b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
102c0 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
102d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
102e0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
102f0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
10300 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20  back ) return;. 
10310 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
10320 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
10330 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
10340 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
10350 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10360 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
10370 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
10380 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
10390 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
103a0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
103b0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
103c0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
103d0 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
103e0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
103f0 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
10400 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
10410 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
10420 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
10430 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
10440 20 7d 0a 20 20 20 20 54 52 41 43 45 32 28 22 44   }.    TRACE2("D
10450 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  ONT_ROLLBACK %d\
10460 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
10470 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
10480 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21  ->ckptInUse && !
10490 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28  pPg->inCkpt && (
104a0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
104b0 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
104c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
104d0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
104e0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
104f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
10500 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
10510 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
10520 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
10530 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d  er->aInCkpt[pPg-
10540 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
10550 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
10560 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b    page_add_to_ck
10570 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  pt_list(pPg);.  
10580 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  }.}../*.** Commi
10590 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
105a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
105b0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
105c0 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
105d0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
105e0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
105f0 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
10600 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
10610 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
10620 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
10630 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
10640 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
10650 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
10660 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
10670 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
10680 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
10690 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
106a0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
106b0 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
106c0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
106d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
106e0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
106f0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
10700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10720 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
10730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10740 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
10750 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
10760 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
10770 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10780 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10790 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
107a0 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
107b0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
107c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
107d0 20 20 7d 0a 20 20 54 52 41 43 45 31 28 22 43 4f    }.  TRACE1("CO
107e0 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28 20  MMIT\n");.  if( 
107f0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
10800 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
10810 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
10820 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
10830 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
10840 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73  teOsSync() calls
10850 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
10860 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
10870 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
10880 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
10890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
108a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
108b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
108c0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
108d0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
108e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
108f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10900 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
10910 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10920 20 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a   );.  rc = syncJ
10930 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
10940 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10950 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
10960 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
10970 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
10980 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
10990 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ges(pPager);.  i
109a0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63  f( pPg ){.    rc
109b0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
109c0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
109d0 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50    if( rc || (!pP
109e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
109f0 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50  sqliteOsSync(&pP
10a00 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54  ager->fd)!=SQLIT
10a10 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67  E_OK) ){.      g
10a20 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
10a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
10a40 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
10a50 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
10a60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10a70 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
10a80 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
10a90 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10aa0 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20  es wrong during 
10ab0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
10ac0 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f  ss..  */.commit_
10ad0 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71  abort:.  rc = sq
10ae0 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
10af0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
10b00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10b20 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
10b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10b40 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
10b50 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
10b60 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
10b70 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  k to read-only m
10b80 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
10b90 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
10ba0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
10bb0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
10bc0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
10bd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
10be0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
10bf0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
10c00 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
10c10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
10c20 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
10c30 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
10c40 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
10c50 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
10c60 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
10c70 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
10c80 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
10c90 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
10ca0 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
10cb0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
10cc0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
10cd0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
10ce0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
10cf0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
10d00 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
10d10 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
10d20 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
10d30 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
10d40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
10d50 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
10d60 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
10d70 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
10d80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52  {.  int rc;.  TR
10d90 41 43 45 31 28 22 52 4f 4c 4c 42 41 43 4b 5c 6e  ACE1("ROLLBACK\n
10da0 22 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ");.  if( !pPage
10db0 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c 20  r->dirtyFile || 
10dc0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
10dd0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
10de0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
10df0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
10e00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10e10 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
10e20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
10e30 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
10e40 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
10e50 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f  Mask!=PAGER_ERR_
10e60 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
10e70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
10e80 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
10e90 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
10ea0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
10eb0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  1);.    }.    re
10ec0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
10ed0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
10ee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10ef0 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
10f00 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
10f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10f20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
10f30 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
10f40 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   1);.  if( rc!=S
10f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10f60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
10f70 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  UPT;.    pPager-
10f80 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
10f90 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
10fa0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
10fb0 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
10fc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10fd0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10ff0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
11000 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
11010 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
11020 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
11030 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
11040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
11050 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
11060 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11070 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
11080 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
11090 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
110a0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
110b0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
110c0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
110d0 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28  litepager_stats(
110e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
110f0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
11100 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
11110 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
11120 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
11130 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
11140 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
11150 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
11160 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
11170 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
11180 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
11190 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
111a0 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
111b0 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
111c0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
111d0 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
111e0 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
111f0 2a 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70  * Set the checkp
11200 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
11210 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
11220 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
11230 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
11240 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
11250 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63  * open.  A new c
11260 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
11270 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
11280 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
11290 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
112a0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
112b0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
112c0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
112d0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
112e0 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
112f0 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
11300 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
11310 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
11320 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
11330 49 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50 61  IZE];.  if( !pPa
11340 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11350 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11360 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  ckptAutoopen = 1
11370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11380 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
11390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
113a0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61  urnalOpen );.  a
113b0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
113c0 63 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20 70  ckptInUse );.  p
113d0 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d  Pager->aInCkpt =
113e0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
113f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
11400 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
11410 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20  ger->aInCkpt==0 
11420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52  ){.    sqliteOsR
11430 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  eadLock(&pPager-
11440 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >fd);.    return
11450 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11460 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
11470 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  G.  rc = sqliteO
11480 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
11490 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
114a0 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >ckptJSize);.  i
114b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70  f( rc ) goto ckp
114c0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
114d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
114e0 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a  ->ckptJSize == .
114f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
11500 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a  *JOURNAL_PG_SZ(j
11510 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a  ournal_format)+J
11520 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f  OURNAL_HDR_SZ(jo
11530 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b  urnal_format) );
11540 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
11550 2d 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50  ->ckptJSize = pP
11560 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e  ager->nRec*JOURN
11570 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c  AL_PG_SZ(journal
11580 5f 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20  _format).       
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f    + JOURNAL_HDR_
115b0 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
115c0 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  t);.  pPager->ck
115d0 70 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ptSize = pPager-
115e0 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21  >dbSize;.  if( !
115f0 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
11600 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11610 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  itepager_opentem
11620 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
11630 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28  ->cpfd);.    if(
11640 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f   rc ) goto ckpt_
11650 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
11660 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
11670 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
11680 65 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30  er->ckptNRec = 0
11690 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
116a0 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  ckptInUse = 1;. 
116b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
116c0 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f  K;. .ckpt_begin_
116d0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
116e0 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b  ager->aInCkpt ){
116f0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11700 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29  pPager->aInCkpt)
11710 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
11720 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nCkpt = 0;.  }. 
11730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11740 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68  *.** Commit a ch
11750 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
11760 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
11770 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
11780 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
11790 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
117a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
117b0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
117c0 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
117d0 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a  ager->cpfd, 0);.
117e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54      /* sqliteOsT
117f0 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
11800 3e 63 70 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >cpfd, 0); */.  
11810 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52    pPager->ckptNR
11820 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
11830 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
11840 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
11850 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  e( pPager->aInCk
11860 70 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pt );.    pPager
11870 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20  ->aInCkpt = 0;. 
11880 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
11890 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20 70  r->pCkpt; pPg; p
118a0 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
118b0 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
118c0 65 78 74 43 6b 70 74 3b 0a 20 20 20 20 20 20 61  extCkpt;.      a
118d0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b  ssert( pPg->inCk
118e0 70 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  pt );.      pPg-
118f0 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  >inCkpt = 0;.   
11900 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70     pPg->pPrevCkp
11910 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b  t = pPg->pNextCk
11920 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pt = 0;.    }.  
11930 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20    pPager->pCkpt 
11940 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
11950 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20  r->ckptAutoopen 
11960 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
11970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11980 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65  * Rollback a che
11990 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  ckpoint..*/.int 
119a0 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
119b0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
119c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
119d0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
119e0 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20  ->ckptInUse ){. 
119f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b     rc = pager_ck
11a00 70 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  pt_playback(pPag
11a10 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70  er);.    sqlitep
11a20 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74  ager_ckpt_commit
11a30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
11a40 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
11a50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
11a60 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65  ger->ckptAutoope
11a70 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
11a80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11a90 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
11aa0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
11ab0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
11ac0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
11ad0 65 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28  epager_filename(
11ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11af0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
11b00 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
11b10 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
11b20 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
11b30 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
11b40 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
11b50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11b60 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
11b70 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 69  c)(void*,void*,i
11b80 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
11b90 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
11ba0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
11bb0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
11bc0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
11bd0 63 41 72 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  cArg;.}..#ifdef 
11be0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
11bf0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
11c00 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
11c10 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
11c20 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
11c30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
11c40 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
11c50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
11c60 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
11c70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
11c80 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
11c90 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
11ca0 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
11cb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
11cc0 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
11cd0 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66  addr=0x%08x nRef
11ce0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
11cf0 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29  pPg->pgno, (int)
11d00 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
11d10 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
11d20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a             }.}.#endif.