/ Hex Artifact Content
Login

Artifact 11fa728362e9e79abccd3aafe3df567d091d2f07:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 31 20 44 2e 20 52 69 63 68  (c) 2001 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74  s published by t
00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32  her.** version 2
00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74   or (at your opt
0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ersion..**.** Th
0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49  ** MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20   GNU.** General 
0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75  .** .** You shou
0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f  c.** License alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62  ng with this lib
0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72  rary; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72  ite to the.** Fr
02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39  dation, Inc., 59
02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20   Temple Place - 
02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f  Suite 330,.** Bo
02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d  ston, MA  02111-
02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a  1307, USA..**.**
0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 24  ***********.** $
03a0: 49 64 3a 20 70 67 2e 63 2c 76 20 31 2e 32 20 32  Id: pg.c,v 1.2 2
03b0: 30 30 31 2f 30 31 2f 32 30 20 31 39 3a 35 32 3a  001/01/20 19:52:
03c0: 34 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  49 drh Exp $.*/.
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
03f0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0400: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0410: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0420: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0430: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0440: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0450: 69 6e 63 6c 75 64 65 20 22 70 67 2e 68 22 0a 0a  include "pg.h"..
0460: 2f 2a 0a 2a 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20  /*.** Uncomment 
0470: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
0480: 72 20 61 20 64 65 62 75 67 20 74 72 61 63 65 0a  r a debug trace.
0490: 2a 2f 0a 23 69 66 20 31 0a 23 20 64 65 66 69 6e  */.#if 1.# defin
04a0: 65 20 54 52 41 43 45 28 58 29 20 20 70 72 69 6e  e TRACE(X)  prin
04b0: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
04c0: 6f 75 74 29 3b 0a 23 65 6e 64 69 66 20 20 0a 0a  out);.#endif  ..
04d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
04e0: 4f 45 52 52 0a 23 20 64 65 66 69 6e 65 20 53 51  OERR.# define SQ
04f0: 4c 49 54 45 5f 49 4f 45 52 52 20 53 51 4c 49 54  LITE_IOERR SQLIT
0500: 45 5f 45 52 52 4f 52 0a 23 65 6e 64 69 66 0a 0a  E_ERROR.#endif..
0510: 2f 2a 0a 2a 2a 20 48 61 73 68 20 74 61 62 6c 65  /*.** Hash table
0520: 20 73 69 7a 65 73 0a 2a 2f 0a 23 64 65 66 69 6e   sizes.*/.#defin
0530: 65 20 4a 5f 48 41 53 48 5f 53 49 5a 45 20 20 31  e J_HASH_SIZE  1
0540: 32 37 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  27  /* Size of t
0550: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
0560: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 23 64  hash table */.#d
0570: 65 66 69 6e 65 20 50 47 5f 48 41 53 48 5f 53 49  efine PG_HASH_SI
0580: 5a 45 20 33 34 39 20 20 2f 2a 20 53 69 7a 65 20  ZE 349  /* Size 
0590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
05a0: 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
05b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  */../*.** Forwar
05c0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66  d declaration of
05d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74 79   structure.*/.ty
05e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 68  pedef struct Pgh
05f0: 64 72 20 50 67 68 64 72 3b 0a 0a 2f 2a 0a 2a 2a  dr Pghdr;../*.**
0600: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
0610: 20 61 62 6f 75 74 20 61 20 73 69 6e 67 6c 65 20   about a single 
0620: 70 61 67 69 6e 67 20 66 69 6c 65 20 69 73 20 63  paging file is c
0630: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a  ontained in an.*
0640: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
0650: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0660: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
0670: 20 50 67 72 20 7b 0a 20 20 69 6e 74 20 66 64 4d   Pgr {.  int fdM
0680: 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ain;            
0690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
06a0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
06b0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
06c0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
06d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
06e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 4a 6f  le */.  int fdJo
0700: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
0710: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
0720: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
0730: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0750: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
0760: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
0770: 69 6e 74 20 6e 4d 65 6d 50 67 3b 20 20 20 20 20  int nMemPg;     
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0790: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
07a0: 72 79 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  ry-resident page
07b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4a 50 67 3b  s */.  int nJPg;
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
07e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
07f0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
0800: 20 6e 44 62 50 67 3b 20 20 20 20 20 20 20 20 20   nDbPg;         
0810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0820: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
0830: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
0840: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 50 67 3b 20  /.  int nRefPg; 
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0870: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
0880: 69 6e 20 75 73 65 20 2a 2f 0a 20 20 50 67 68 64  in use */.  Pghd
0890: 72 20 2a 70 4c 72 75 2c 20 2a 70 4d 72 75 3b 20  r *pLru, *pMru; 
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
08b0: 61 73 74 20 61 6e 64 20 6d 6f 73 74 20 72 65 63  ast and most rec
08c0: 65 6e 74 6c 79 20 75 73 65 64 20 6d 65 6d 2d 70  ently used mem-p
08d0: 61 67 65 20 2a 2f 0a 20 20 50 67 68 64 72 20 2a  age */.  Pghdr *
08e0: 70 4a 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  pJidx;          
08f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0900: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 6e 64 65 78  of journal index
0910: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 68 64   pages */.  Pghd
0920: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
0930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
0940: 6c 20 70 61 67 65 73 2c 20 65 78 63 65 70 74 20  l pages, except 
0950: 6a 6f 75 72 6e 61 6c 20 69 6e 64 65 78 20 70 61  journal index pa
0960: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 61 4a 48  ges */.  u32 aJH
0970: 61 73 68 5b 4a 5f 48 41 53 48 5f 53 49 5a 45 5d  ash[J_HASH_SIZE]
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  ;       /* Journ
0990: 61 6c 20 70 61 67 65 20 68 61 73 68 20 74 61 62  al page hash tab
09a0: 6c 65 20 2a 2f 0a 20 20 50 67 68 64 72 20 2a 61  le */.  Pghdr *a
09b0: 50 67 48 61 73 68 5b 50 47 5f 48 41 53 48 5f 53  PgHash[PG_HASH_S
09c0: 49 5a 45 5d 3b 20 20 2f 2a 20 4d 65 6d 2d 70 61  IZE];  /* Mem-pa
09d0: 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
09e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
09f0: 6d 65 6d 6f 72 79 2d 72 65 73 69 64 65 6e 74 20  memory-resident 
0a00: 70 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 69  page of the pagi
0a10: 6e 67 20 66 69 6c 65 20 68 61 73 20 61 20 68 65  ng file has a he
0a20: 61 64 65 72 20 77 68 69 63 68 0a 2a 2a 20 69 73  ader which.** is
0a30: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0a50: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
0a60: 63 74 20 50 67 68 64 72 20 7b 0a 20 20 50 67 72  ct Pghdr {.  Pgr
0a70: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
0a80: 2f 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20  /* Pointer back 
0a90: 74 6f 20 74 68 65 20 50 67 72 20 73 74 72 75 63  to the Pgr struc
0aa0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ture */.  int nR
0ab0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
0ac0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
0ad0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 70 61 67  nces to this pag
0ae0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 72  e */.  int isDir
0af0: 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ty;       /* TRU
0b00: 45 20 69 66 20 6e 65 65 64 73 20 74 6f 20 62 65  E if needs to be
0b10: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
0b20: 20 2a 2f 0a 20 20 75 33 32 20 64 62 70 67 6e 6f   */.  u32 dbpgno
0b30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
0b40: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
0b50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
0b60: 20 20 75 33 32 20 6a 70 67 6e 6f 3b 20 20 20 20    u32 jpgno;    
0b70: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
0b80: 62 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ber in the journ
0b90: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 68  al file */.  Pgh
0ba0: 64 72 20 2a 70 4e 78 3b 20 20 20 20 20 20 20 20  dr *pNx;        
0bb0: 2f 2a 20 4e 65 78 74 20 70 61 67 65 20 6f 6e 20  /* Next page on 
0bc0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
0bd0: 6c 6c 20 2a 2f 0a 20 20 50 67 68 64 72 20 2a 70  ll */.  Pghdr *p
0be0: 4c 72 75 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65  Lru;       /* Le
0bf0: 73 73 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  ss recently used
0c00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 68 64   pages */.  Pghd
0c10: 72 20 2a 70 4d 72 75 3b 20 20 20 20 20 20 20 2f  r *pMru;       /
0c20: 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 6c 79 20  * More recently 
0c30: 75 73 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  used pages */.  
0c40: 50 67 68 64 72 20 2a 70 4e 78 48 61 73 68 3b 20  Pghdr *pNxHash; 
0c50: 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 74 68 20     /* Next with 
0c60: 73 61 6d 65 20 64 62 70 67 6e 6f 20 68 61 73 68  same dbpgno hash
0c70: 20 2a 2f 0a 20 20 50 67 68 64 72 20 2a 70 50 76   */.  Pghdr *pPv
0c80: 48 61 73 68 3b 20 20 20 20 2f 2a 20 50 72 65 76  Hash;    /* Prev
0c90: 69 6f 75 73 20 77 69 74 68 20 74 68 65 20 73 61  ious with the sa
0ca0: 6d 65 20 64 62 70 67 6e 6f 20 68 61 73 68 20 2a  me dbpgno hash *
0cb0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  /.};../*.** For 
0cc0: 61 20 6d 65 6d 6f 72 79 2d 72 65 73 69 64 65 6e  a memory-residen
0cd0: 74 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  t page, the page
0ce0: 20 64 61 74 61 20 63 6f 6d 65 73 20 69 6d 6d 65   data comes imme
0cf0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 0a 2a 2a  diately after.**
0d00: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
0d10: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0d20: 20 6d 61 63 72 6f 73 20 63 61 6e 20 62 65 20 75   macros can be u
0d30: 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 61 20  sed to change a 
0d40: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  .** pointer to a
0d50: 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 74   page header int
0d60: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  o a pointer to t
0d70: 68 65 20 64 61 74 61 2c 20 6f 72 20 76 69 63 65  he data, or vice
0d80: 0a 2a 2a 20 76 65 72 73 61 2e 0a 2a 2f 0a 23 64  .** versa..*/.#d
0d90: 65 66 69 6e 65 20 50 47 5f 54 4f 5f 44 41 54 41  efine PG_TO_DATA
0da0: 28 58 29 20 20 28 28 76 6f 69 64 2a 29 26 28 58  (X)  ((void*)&(X
0db0: 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 44 41  )[1]).#define DA
0dc0: 54 41 5f 54 4f 5f 50 47 28 58 29 20 20 28 26 28  TA_TO_PG(X)  (&(
0dd0: 28 50 67 68 64 72 2a 29 28 58 29 29 5b 2d 31 5d  (Pghdr*)(X))[-1]
0de0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  )../*.** The num
0df0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
0e00: 20 70 61 67 65 73 20 74 68 61 74 20 77 65 20 61   pages that we a
0e10: 63 63 75 6d 75 6c 61 74 65 20 62 65 66 6f 72 65  ccumulate before
0e20: 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 72 65   trying.** to re
0e30: 75 73 65 20 6f 6c 64 65 72 20 70 61 67 65 73 20  use older pages 
0e40: 77 68 65 6e 20 6e 65 77 20 6f 6e 65 73 20 61 72  when new ones ar
0e50: 65 20 72 65 71 75 65 73 74 65 64 2e 0a 2a 2f 0a  e requested..*/.
0e60: 23 64 65 66 69 6e 65 20 4d 58 5f 4d 45 4d 5f 50  #define MX_MEM_P
0e70: 41 47 45 20 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  AGE  100../*.** 
0e80: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  The number of jo
0e90: 75 72 6e 61 6c 20 64 61 74 61 20 70 61 67 65 73  urnal data pages
0ea0: 20 74 68 61 74 20 63 6f 6d 65 20 62 65 74 77 65   that come betwe
0eb0: 65 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 0a  en consecutive .
0ec0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 64 65 78  ** journal index
0ed0: 20 70 61 67 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   pages..*/.#defi
0ee0: 6e 65 20 4e 5f 4a 5f 44 41 54 41 50 41 47 45 20  ne N_J_DATAPAGE 
0ef0: 20 28 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49   (SQLITE_PAGE_SI
0f00: 5a 45 2f 28 32 2a 73 69 7a 65 6f 66 28 75 33 32  ZE/(2*sizeof(u32
0f10: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  )))../*.** An in
0f20: 64 65 78 20 70 61 67 65 20 69 6e 20 74 68 65 20  dex page in the 
0f30: 6a 6f 75 72 6e 61 6c 20 63 6f 6e 73 69 73 74 73  journal consists
0f40: 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20   of an array of 
0f50: 4e 5f 4a 5f 44 41 54 41 50 41 47 45 0a 2a 2a 20  N_J_DATAPAGE.** 
0f60: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0f70: 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 54 68   structures.  Th
0f80: 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
0f90: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0fa0: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
0fb0: 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  e for each of th
0fc0: 65 20 4e 5f 4a 5f 44 41 54 41 50 41 47 45 20 64  e N_J_DATAPAGE d
0fd0: 61 74 61 20 70 61 67 65 73 20 74 68 61 74 20 66  ata pages that f
0fe0: 6f 6c 6c 6f 77 20 74 68 65 0a 2a 2a 20 69 6e 64  ollow the.** ind
0ff0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 74 68  ex..**.** Let th
1000: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  e journal page n
1010: 75 6d 62 65 72 20 74 68 61 74 20 61 20 4a 69 64  umber that a Jid
1020: 78 45 6e 74 72 79 20 64 65 73 63 72 69 62 65 73  xEntry describes
1030: 20 62 65 20 4a 2e 20 20 54 68 65 6e 0a 2a 2a 20   be J.  Then.** 
1040: 74 68 65 20 4a 69 64 78 45 6e 74 72 79 2e 64 62  the JidxEntry.db
1050: 70 67 6e 6f 20 66 69 65 6c 64 20 69 73 20 74 68  pgno field is th
1060: 65 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  e page of the da
1070: 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
1080: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1090: 74 6f 20 74 68 65 20 4a 20 70 61 67 65 20 69 6e  to the J page in
10a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
10b0: 68 65 20 4a 69 64 78 45 6e 74 72 79 2e 6e 65 78  he JidxEntry.nex
10c0: 74 5f 6a 70 67 6e 6f 0a 2a 2a 20 66 69 65 6c 64  t_jpgno.** field
10d0: 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65 72   hold the number
10e0: 20 6f 66 20 61 6e 6f 74 68 65 72 20 6a 6f 75 72   of another jour
10f0: 6e 61 6c 20 70 61 67 65 20 74 68 61 74 20 63 6f  nal page that co
1100: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 64 61 74 61  ntains.** a data
1110: 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 77  base file page w
1120: 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
1130: 68 20 61 73 20 4a 69 64 78 45 6e 74 72 79 2e 64  h as JidxEntry.d
1140: 62 70 67 6e 6f 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  bpgno..**.** All
1150: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1160: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1170: 6f 75 72 6e 61 6c 20 69 6e 64 65 78 20 69 6e 20  ournal index in 
1180: 62 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20 6e 6f  big-endian.** no
1190: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
11a0: 65 66 20 73 74 72 75 63 74 20 4a 69 64 78 45 6e  ef struct JidxEn
11b0: 74 72 79 20 4a 69 64 78 45 6e 74 72 79 3b 0a 73  try JidxEntry;.s
11c0: 74 72 75 63 74 20 4a 69 64 78 45 6e 74 72 79 20  truct JidxEntry 
11d0: 7b 0a 20 20 63 68 61 72 20 64 62 70 67 6e 6f 5b  {.  char dbpgno[
11e0: 73 69 7a 65 6f 66 28 75 33 32 29 5d 3b 20 20 20  sizeof(u32)];   
11f0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1200: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1210: 20 74 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20   this entry */. 
1220: 20 63 68 61 72 20 6e 65 78 74 5f 6a 70 67 6e 6f   char next_jpgno
1230: 5b 73 69 7a 65 6f 66 28 75 33 32 29 5d 3b 20 20  [sizeof(u32)];  
1240: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1250: 77 69 74 68 20 73 61 6d 65 20 68 61 73 68 20 6f  with same hash o
1260: 6e 20 64 62 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a  n dbpgno */.};..
1270: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 70 61 67  /*.** Read a pag
1280: 65 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  e from a file in
1290: 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 52 65 74 75  to memory.  Retu
12a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
12b0: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 54  successful..** T
12c0: 68 65 20 22 70 67 6e 6f 22 20 70 61 72 61 6d 65  he "pgno" parame
12d0: 74 65 72 20 74 65 6c 6c 73 20 77 68 65 72 65 20  ter tells where 
12e0: 69 6e 20 74 68 65 20 66 69 6c 65 20 74 6f 20 72  in the file to r
12f0: 65 61 64 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ead the page..**
1300: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
1310: 69 73 20 31 2e 20 20 46 69 6c 65 73 20 64 6f 20  is 1.  Files do 
1320: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 70 61  not contain a pa
1330: 67 65 20 30 20 73 69 6e 63 65 20 61 20 70 61 67  ge 0 since a pag
1340: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 30  e.** number of 0
1350: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 64 69   is used to indi
1360: 63 61 74 65 20 22 6e 6f 20 73 75 63 68 20 70 61  cate "no such pa
1370: 67 65 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge"..*/.static i
1380: 6e 74 20 73 71 6c 69 74 65 50 67 52 65 61 64 28  nt sqlitePgRead(
1390: 69 6e 74 20 66 64 2c 20 63 68 61 72 20 2a 7a 42  int fd, char *zB
13a0: 75 66 2c 20 75 33 32 20 70 67 6e 6f 29 7b 0a 20  uf, u32 pgno){. 
13b0: 20 69 6e 74 20 67 6f 74 20 3d 20 30 3b 0a 20 20   int got = 0;.  
13c0: 69 6e 74 20 61 6d 74 3b 0a 0a 20 20 61 73 73 65  int amt;..  asse
13d0: 72 74 28 20 70 67 6e 6f 3e 30 20 29 3b 0a 20 20  rt( pgno>0 );.  
13e0: 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
13f0: 0a 20 20 6c 73 65 65 6b 28 66 64 2c 20 53 45 45  .  lseek(fd, SEE
1400: 4b 5f 53 45 54 2c 20 28 70 67 6e 6f 2d 31 29 2a  K_SET, (pgno-1)*
1410: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
1420: 29 3b 0a 20 20 77 68 69 6c 65 28 20 67 6f 74 3c  );.  while( got<
1430: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
1440: 20 29 7b 0a 20 20 20 20 61 6d 74 20 3d 20 72 65   ){.    amt = re
1450: 61 64 28 66 64 2c 20 26 7a 42 75 66 5b 67 6f 74  ad(fd, &zBuf[got
1460: 5d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ], SQLITE_PAGE_S
1470: 49 5a 45 20 2d 20 67 6f 74 29 3b 0a 20 20 20 20  IZE - got);.    
1480: 69 66 28 20 61 6d 74 3c 3d 30 20 29 7b 0a 20 20  if( amt<=0 ){.  
1490: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 42 75 66      memset(&zBuf
14a0: 5b 67 6f 74 5d 2c 20 30 2c 20 53 51 4c 49 54 45  [got], 0, SQLITE
14b0: 5f 50 41 47 45 5f 53 49 5a 45 20 2d 20 67 6f 74  _PAGE_SIZE - got
14c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14d0: 61 6d 74 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f  amt==0 ? SQLITE_
14e0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
14f0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  R;.    }.    got
1500: 20 2b 3d 20 61 6d 74 3b 0a 20 20 7d 0a 20 20 72   += amt;.  }.  r
1510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
1530: 20 70 61 67 65 20 66 72 6f 6d 20 61 20 66 69 6c   page from a fil
1540: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20  e into memory.  
1550: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1560: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
1570: 2a 2a 20 54 68 65 20 22 70 67 6e 6f 22 20 70 61  ** The "pgno" pa
1580: 72 61 6d 65 74 65 72 20 74 65 6c 6c 73 20 77 68  rameter tells wh
1590: 65 72 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ere in the file 
15a0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 67  to write the pag
15b0: 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  e..** The first 
15c0: 70 61 67 65 20 69 73 20 31 2e 20 20 46 69 6c 65  page is 1.  File
15d0: 73 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s do not contain
15e0: 20 61 20 70 61 67 65 20 30 20 73 69 6e 63 65 20   a page 0 since 
15f0: 61 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  a page.** number
1600: 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 74 6f   of 0 is used to
1610: 20 69 6e 64 69 63 61 74 65 20 22 6e 6f 20 73 75   indicate "no su
1620: 63 68 20 70 61 67 65 22 2e 0a 2a 2f 0a 73 74 61  ch page"..*/.sta
1630: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 67  tic int sqlitePg
1640: 57 72 69 74 65 28 69 6e 74 20 66 64 2c 20 63 68  Write(int fd, ch
1650: 61 72 20 2a 7a 42 75 66 2c 20 75 33 32 20 70 67  ar *zBuf, u32 pg
1660: 6e 6f 29 7b 0a 20 20 69 6e 74 20 64 6f 6e 65 20  no){.  int done 
1670: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  = 0;.  int amt;.
1680: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e  .  assert( pgno>
1690: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  0 );.  assert( f
16a0: 64 3e 3d 30 20 29 3b 0a 20 20 6c 73 65 65 6b 28  d>=0 );.  lseek(
16b0: 66 64 2c 20 53 45 45 4b 5f 53 45 54 2c 20 28 70  fd, SEEK_SET, (p
16c0: 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41  gno-1)*SQLITE_PA
16d0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 77 68 69 6c  GE_SIZE);.  whil
16e0: 65 28 20 64 6f 6e 65 3c 53 51 4c 49 54 45 5f 50  e( done<SQLITE_P
16f0: 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
1700: 61 6d 74 20 3d 20 77 72 69 74 65 28 66 64 2c 20  amt = write(fd, 
1710: 26 7a 42 75 66 5b 64 6f 6e 65 5d 2c 20 53 51 4c  &zBuf[done], SQL
1720: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 2d 20  ITE_PAGE_SIZE - 
1730: 64 6f 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 61  done);.    if( a
1740: 6d 74 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  mt<=0 ) return S
1750: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
1760: 20 64 6f 6e 65 20 2b 3d 20 61 6d 74 3b 0a 20 20   done += amt;.  
1770: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1780: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1790: 75 72 6e 20 66 6f 75 72 20 62 79 74 65 73 20 69  urn four bytes i
17a0: 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  nto an integer. 
17b0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
17c0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a 2a 2a  is always the.**
17d0: 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
17e0: 74 20 38 20 62 69 74 73 2e 0a 2a 2f 0a 73 74 61  t 8 bits..*/.sta
17f0: 74 69 63 20 75 33 32 20 73 71 6c 69 74 65 50 67  tic u32 sqlitePg
1800: 47 65 74 49 6e 74 28 63 6f 6e 73 74 20 63 68 61  GetInt(const cha
1810: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
1820: 28 28 70 5b 30 5d 26 30 78 66 66 29 3c 3c 32 34  ((p[0]&0xff)<<24
1830: 29 20 7c 20 28 28 70 5b 31 5d 26 30 78 66 66 29  ) | ((p[1]&0xff)
1840: 3c 3c 31 36 29 20 7c 20 28 28 70 5b 32 5d 26 30  <<16) | ((p[2]&0
1850: 78 66 66 29 3c 3c 38 29 20 7c 20 28 70 5b 33 5d  xff)<<8) | (p[3]
1860: 26 30 78 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &0xff);.}../*.**
1870: 20 54 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72   Turn an integer
1880: 20 69 6e 74 6f 20 34 20 62 79 74 65 73 2e 20 20   into 4 bytes.  
1890: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  The first byte i
18a0: 73 20 61 6c 77 61 79 73 20 74 68 65 0a 2a 2a 20  s always the.** 
18b0: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
18c0: 20 38 20 62 69 74 73 2e 0a 2a 2f 0a 73 74 61 74   8 bits..*/.stat
18d0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 50 67  ic void sqlitePg
18e0: 50 75 74 49 6e 74 28 75 33 32 20 76 2c 20 63 68  PutInt(u32 v, ch
18f0: 61 72 20 2a 70 29 7b 0a 20 20 70 5b 33 5d 20 3d  ar *p){.  p[3] =
1900: 20 76 20 26 20 30 78 66 66 3b 0a 20 20 76 20 3e   v & 0xff;.  v >
1910: 3e 3d 20 38 3b 0a 20 20 70 5b 32 5d 20 3d 20 76  >= 8;.  p[2] = v
1920: 20 26 20 30 78 66 66 3b 0a 20 20 76 20 3e 3e 3d   & 0xff;.  v >>=
1930: 20 38 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 20 26   8;.  p[1] = v &
1940: 20 30 78 66 66 3b 0a 20 20 76 20 3e 3e 3d 20 38   0xff;.  v >>= 8
1950: 3b 0a 20 20 70 5b 30 5d 20 3d 20 76 20 26 20 30  ;.  p[0] = v & 0
1960: 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  xff;.}../*.** Ch
1970: 65 63 6b 20 74 68 65 20 68 61 73 68 20 74 61 62  eck the hash tab
1980: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
1990: 6f 72 79 20 70 61 67 65 2e 20 20 52 65 74 75 72  ory page.  Retur
19a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
19b0: 2a 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  * the page heade
19c0: 72 20 69 66 20 66 6f 75 6e 64 2e 20 20 52 65 74  r if found.  Ret
19d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
19e0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 6d  page is not in m
19f0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
1a00: 20 50 67 68 64 72 20 2a 73 71 6c 69 74 65 50 67   Pghdr *sqlitePg
1a10: 46 69 6e 64 28 50 67 72 20 2a 70 2c 20 75 33 32  Find(Pgr *p, u32
1a20: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 68 3b   pgno){.  int h;
1a30: 0a 20 20 50 67 68 64 72 20 2a 70 50 67 3b 0a 0a  .  Pghdr *pPg;..
1a40: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
1a50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
1a60: 70 67 6e 6f 20 25 20 50 47 5f 48 41 53 48 5f 53  pgno % PG_HASH_S
1a70: 49 5a 45 3b 0a 20 20 66 6f 72 28 70 50 67 20 3d  IZE;.  for(pPg =
1a80: 20 70 2d 3e 61 50 67 48 61 73 68 5b 68 5d 3b 20   p->aPgHash[h]; 
1a90: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1aa0: 78 48 61 73 68 29 7b 0a 20 20 20 20 69 66 28 20  xHash){.    if( 
1ab0: 70 50 67 2d 3e 64 62 70 67 6e 6f 3d 3d 70 67 6e  pPg->dbpgno==pgn
1ac0: 6f 20 29 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  o ) return pPg;.
1ad0: 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 50 47    }.  TRACE(("PG
1ae0: 3a 20 64 61 74 61 20 70 61 67 65 20 25 75 20 69  : data page %u i
1af0: 73 20 25 23 78 5c 6e 22 2c 20 70 67 6e 6f 2c 20  s %#x\n", pgno, 
1b00: 28 75 33 32 29 70 50 67 29 29 3b 0a 20 20 72 65  (u32)pPg));.  re
1b10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1b20: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
1b30: 72 6e 20 61 6e 20 69 6e 64 65 78 20 70 61 67 65  rn an index page
1b40: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b50: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  l..**.** The fir
1b60: 73 74 20 70 61 67 65 20 6f 66 20 61 20 6a 6f 75  st page of a jou
1b70: 72 6e 61 6c 20 69 73 20 74 68 65 20 70 72 69 6d  rnal is the prim
1b80: 61 72 79 20 69 6e 64 65 78 2e 20 20 41 64 64 69  ary index.  Addi
1b90: 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  tional.** index 
1ba0: 70 61 67 65 73 20 61 72 65 20 63 61 6c 6c 65 64  pages are called
1bb0: 20 73 65 63 6f 6e 64 61 72 79 20 69 6e 64 69 63   secondary indic
1bc0: 65 73 2e 20 20 49 6e 64 65 78 20 70 61 67 65 73  es.  Index pages
1bd0: 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 74 68   appear.** in th
1be0: 65 20 6a 6f 75 72 6e 61 6c 20 61 73 20 6f 66 74  e journal as oft
1bf0: 65 6e 20 61 73 20 6e 65 65 64 65 64 2e 20 20 28  en as needed.  (
1c00: 49 66 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  If SQLITE_PAGE_S
1c10: 49 5a 45 3d 3d 31 30 32 34 2c 0a 2a 2a 20 74 68  IZE==1024,.** th
1c20: 65 6e 20 74 68 65 72 65 20 61 72 65 20 31 30 32  en there are 102
1c30: 34 2f 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20  4/sizeof(int)*2 
1c40: 3d 20 31 32 38 20 64 61 74 61 62 61 73 65 20 62  = 128 database b
1c50: 65 74 77 65 65 6e 20 65 61 63 68 0a 2a 2a 20 70  etween each.** p
1c60: 61 69 72 20 6f 66 20 69 6e 64 65 78 20 70 61 67  air of index pag
1c70: 65 73 2e 29 20 20 4a 6f 75 72 6e 61 6c 20 69 6e  es.)  Journal in
1c80: 64 65 78 20 70 61 67 65 73 20 61 72 65 20 6e 6f  dex pages are no
1c90: 74 20 68 61 73 68 65 64 20 61 6e 64 0a 2a 2a 20  t hashed and.** 
1ca0: 64 6f 20 6e 6f 20 61 70 70 65 61 72 20 6f 6e 20  do no appear on 
1cb0: 74 68 65 20 50 67 72 2e 70 41 6c 6c 20 6c 69 73  the Pgr.pAll lis
1cc0: 74 2e 20 20 49 6e 64 65 78 20 70 61 67 65 73 20  t.  Index pages 
1cd0: 61 72 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 50 67  are on the.** Pg
1ce0: 72 2e 70 4a 69 64 78 20 6c 69 73 74 20 6f 6e 6c  r.pJidx list onl
1cf0: 79 2e 20 20 49 6e 64 65 78 20 70 61 67 65 73 20  y.  Index pages 
1d00: 68 61 76 65 20 50 67 68 64 72 2e 64 62 70 67 6e  have Pghdr.dbpgn
1d10: 6f 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o==0..**.** If t
1d20: 68 65 20 72 65 71 75 65 73 74 65 64 20 69 6e 64  he requested ind
1d30: 65 78 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ex page is not a
1d40: 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79  lready in memory
1d50: 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6e 65 77 20  , then a.** new 
1d60: 6d 65 6d 6f 72 79 20 70 61 67 65 20 69 73 20 63  memory page is c
1d70: 72 65 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  reated to hold t
1d80: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  he index..**.** 
1d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1da0: 6c 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20  l return a NULL 
1db0: 70 6f 69 6e 74 65 72 20 69 66 20 77 65 20 72 75  pointer if we ru
1dc0: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
1dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 68 64 72  .*/.static Pghdr
1de0: 20 2a 73 71 6c 69 74 65 50 67 46 69 6e 64 4a 69   *sqlitePgFindJi
1df0: 64 78 28 50 67 72 20 2a 70 2c 20 75 33 32 20 70  dx(Pgr *p, u32 p
1e00: 67 6e 6f 29 7b 0a 20 20 50 67 68 64 72 20 2a 70  gno){.  Pghdr *p
1e10: 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1e20: 67 6e 6f 20 25 20 28 4e 5f 4a 5f 44 41 54 41 50  gno % (N_J_DATAP
1e30: 41 47 45 2b 31 29 20 3d 3d 20 31 20 29 3b 0a 20  AGE+1) == 1 );. 
1e40: 20 66 6f 72 28 70 50 67 3d 70 2d 3e 70 4a 69 64   for(pPg=p->pJid
1e50: 78 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  x; pPg; pPg=pPg-
1e60: 3e 70 4e 78 29 7b 0a 20 20 20 20 69 66 28 20 70  >pNx){.    if( p
1e70: 50 67 2d 3e 6a 70 67 6e 6f 3d 3d 70 67 6e 6f 20  Pg->jpgno==pgno 
1e80: 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
1e90: 22 50 47 3a 20 66 6f 75 6e 64 20 6a 2d 69 6e 64  "PG: found j-ind
1ea0: 65 78 20 25 75 20 61 74 20 25 23 78 5c 6e 22 2c  ex %u at %#x\n",
1eb0: 20 70 67 6e 6f 2c 20 28 75 33 32 29 70 50 67 29   pgno, (u32)pPg)
1ec0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ed0: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pPg;.    }.  }. 
1ee0: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
1ef0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 50 67 68 64  loc( sizeof(Pghd
1f00: 72 29 2b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  r)+SQLITE_PAGE_S
1f10: 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 70 50 67  IZE );.  if( pPg
1f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1f30: 20 20 70 50 67 2d 3e 6a 70 67 6e 6f 20 3d 20 70    pPg->jpgno = p
1f40: 67 6e 6f 3b 0a 20 20 70 50 67 2d 3e 70 4e 78 20  gno;.  pPg->pNx 
1f50: 3d 20 70 2d 3e 70 4a 69 64 78 3b 0a 20 20 70 2d  = p->pJidx;.  p-
1f60: 3e 70 4a 69 64 78 20 3d 20 70 50 67 3b 0a 20 20  >pJidx = pPg;.  
1f70: 73 71 6c 69 74 65 50 67 52 65 61 64 28 70 2d 3e  sqlitePgRead(p->
1f80: 66 64 4a 6f 75 72 6e 61 6c 2c 20 50 47 5f 54 4f  fdJournal, PG_TO
1f90: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 67 6e 6f  _DATA(pPg), pgno
1fa0: 29 3b 0a 20 20 54 52 41 43 45 28 28 22 50 47 3a  );.  TRACE(("PG:
1fb0: 20 63 72 65 61 74 65 20 6a 2d 69 6e 64 65 78 20   create j-index 
1fc0: 25 75 20 61 74 20 25 23 78 5c 6e 22 2c 20 70 67  %u at %#x\n", pg
1fd0: 6e 6f 2c 20 28 75 33 32 29 70 50 67 29 29 3b 0a  no, (u32)pPg));.
1fe0: 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
1ff0: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 69 6e 20 74  ./*.** Look in t
2000: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 65  he journal to se
2010: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 64  e if the given d
2020: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
2030: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
2040: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 69 74   journal.  If it
2050: 20 69 73 2c 20 72 65 74 75 72 6e 20 69 74 73 20   is, return its 
2060: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
2070: 62 65 72 2e 20 20 49 66 0a 2a 2a 20 6e 6f 74 2c  ber.  If.** not,
2080: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2090: 61 74 69 63 20 75 33 32 20 73 71 6c 69 74 65 50  atic u32 sqliteP
20a0: 67 4a 6f 75 72 6e 61 6c 50 61 67 65 4e 75 6d 62  gJournalPageNumb
20b0: 65 72 28 50 67 72 20 2a 70 2c 20 75 33 32 20 64  er(Pgr *p, u32 d
20c0: 62 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 6a 70  bpgno){.  u32 jp
20d0: 67 6e 6f 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  gno;.  .  assert
20e0: 28 20 64 62 70 67 6e 6f 3e 30 20 29 3b 0a 20 20  ( dbpgno>0 );.  
20f0: 6a 70 67 6e 6f 20 3d 20 70 2d 3e 61 4a 48 61 73  jpgno = p->aJHas
2100: 68 5b 64 62 70 67 6e 6f 20 25 20 4a 5f 48 41 53  h[dbpgno % J_HAS
2110: 48 5f 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  H_SIZE];.  while
2120: 28 20 6a 70 67 6e 6f 21 3d 30 20 29 7b 0a 20 20  ( jpgno!=0 ){.  
2130: 20 20 69 6e 74 20 69 64 78 5f 6e 75 6d 3b 20 20    int idx_num;  
2140: 20 20 20 2f 2a 20 57 68 69 63 68 20 6a 6f 75 72     /* Which jour
2150: 6e 61 6c 20 69 6e 64 65 78 20 64 65 73 63 72 69  nal index descri
2160: 62 65 73 20 70 61 67 65 20 6a 70 67 6e 6f 20 2a  bes page jpgno *
2170: 2f 0a 20 20 20 20 69 6e 74 20 69 70 67 6e 6f 3b  /.    int ipgno;
2180: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2190: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6a 6f  umber for the jo
21a0: 75 72 6e 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20  urnal index */. 
21b0: 20 20 20 69 6e 74 20 69 64 78 5f 73 6c 6f 74 3b     int idx_slot;
21c0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 65 6e 74      /* Which ent
21d0: 72 79 20 69 6e 20 69 6e 64 65 78 20 69 64 78 5f  ry in index idx_
21e0: 6e 75 6d 20 64 65 73 63 72 69 62 65 73 20 6a 70  num describes jp
21f0: 67 6e 6f 20 2a 2f 0a 20 20 20 20 50 67 68 64 72  gno */.    Pghdr
2200: 20 2a 70 49 64 78 50 67 3b 20 20 20 2f 2a 20 54   *pIdxPg;   /* T
2210: 68 65 20 69 6e 64 65 78 20 70 61 67 65 20 66 6f  he index page fo
2220: 72 20 6a 70 67 6e 6f 20 2a 2f 0a 20 20 20 20 4a  r jpgno */.    J
2230: 69 64 78 45 6e 74 72 79 20 2a 61 49 64 78 3b 20  idxEntry *aIdx; 
2240: 2f 2a 20 54 68 65 20 64 61 74 61 20 66 6f 72 20  /* The data for 
2250: 74 68 65 20 69 6e 64 65 78 20 70 61 67 65 20 2a  the index page *
2260: 2f 0a 0a 20 20 20 20 69 64 78 5f 6e 75 6d 20 3d  /..    idx_num =
2270: 20 28 6a 70 67 6e 6f 20 2d 20 31 29 2f 28 4e 5f   (jpgno - 1)/(N_
2280: 4a 5f 44 41 54 41 50 41 47 45 20 2b 20 31 29 3b  J_DATAPAGE + 1);
2290: 0a 20 20 20 20 69 64 78 5f 73 6c 6f 74 20 3d 20  .    idx_slot = 
22a0: 28 6a 70 67 6e 6f 20 2d 20 31 29 20 25 20 28 4e  (jpgno - 1) % (N
22b0: 5f 4a 5f 44 41 54 41 50 41 47 45 20 2b 20 31 29  _J_DATAPAGE + 1)
22c0: 20 2d 20 32 3b 0a 20 20 20 20 69 70 67 6e 6f 20   - 2;.    ipgno 
22d0: 3d 20 69 64 78 5f 6e 75 6d 20 2a 20 28 4e 5f 4a  = idx_num * (N_J
22e0: 5f 44 41 54 41 50 41 47 45 20 2b 20 31 29 20 2b  _DATAPAGE + 1) +
22f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 69 70 67 6e   1;.    if( ipgn
2300: 6f 3e 70 2d 3e 6e 4a 50 67 20 29 7b 0a 20 20 20  o>p->nJPg ){.   
2310: 20 20 20 6a 70 67 6e 6f 20 3d 20 30 3b 0a 20 20     jpgno = 0;.  
2320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2330: 0a 20 20 20 20 70 49 64 78 50 67 20 3d 20 73 71  .    pIdxPg = sq
2340: 6c 69 74 65 50 67 46 69 6e 64 4a 69 64 78 28 70  litePgFindJidx(p
2350: 2c 20 69 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  , ipgno);.    as
2360: 73 65 72 74 28 20 70 49 64 78 50 67 21 3d 30 20  sert( pIdxPg!=0 
2370: 29 3b 0a 20 20 20 20 61 49 64 78 20 3d 20 50 47  );.    aIdx = PG
2380: 5f 54 4f 5f 44 41 54 41 28 70 49 64 78 50 67 29  _TO_DATA(pIdxPg)
2390: 3b 0a 20 20 20 20 69 66 28 20 64 62 70 67 6e 6f  ;.    if( dbpgno
23a0: 3d 3d 73 71 6c 69 74 65 50 67 47 65 74 49 6e 74  ==sqlitePgGetInt
23b0: 28 61 49 64 78 5b 69 64 78 5f 73 6c 6f 74 5d 2e  (aIdx[idx_slot].
23c0: 64 62 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  dbpgno) ){.     
23d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23e0: 20 20 6a 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65    jpgno = sqlite
23f0: 50 67 47 65 74 49 6e 74 28 61 49 64 78 5b 69 64  PgGetInt(aIdx[id
2400: 78 5f 73 6c 6f 74 5d 2e 6e 65 78 74 5f 6a 70 67  x_slot].next_jpg
2410: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2420: 6e 20 6a 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n jpgno;.}../*.*
2430: 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 6e 6f  * Make a page no
2440: 74 20 64 69 72 74 79 20 62 79 20 77 72 69 74 69  t dirty by writi
2450: 6e 67 20 69 74 20 74 6f 20 74 68 65 20 6a 6f 75  ng it to the jou
2460: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
2470: 69 6e 74 20 73 71 6c 69 74 65 50 67 4d 61 6b 65  int sqlitePgMake
2480: 43 6c 65 61 6e 28 50 67 68 64 72 20 2a 70 50 67  Clean(Pghdr *pPg
2490: 29 7b 0a 20 20 50 67 72 20 2a 70 20 3d 20 70 50  ){.  Pgr *p = pP
24a0: 67 2d 3e 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  g->p;.  int rc;.
24b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
24c0: 69 73 44 69 72 74 79 20 29 3b 0a 20 20 61 73 73  isDirty );.  ass
24d0: 65 72 74 28 20 70 2d 3e 66 64 4a 6f 75 72 6e 61  ert( p->fdJourna
24e0: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  l>=0 );.  if( pP
24f0: 67 2d 3e 6a 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  g->jpgno==0 ){. 
2500: 20 20 20 69 6e 74 20 6a 70 67 6e 6f 3b 20 20 20     int jpgno;   
2510: 20 20 20 20 2f 2a 20 41 20 6e 65 77 6c 79 20 61      /* A newly a
2520: 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 6e 20  llocate page in 
2530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2540: 20 20 20 69 6e 74 20 69 64 78 5f 6e 75 6d 3b 20     int idx_num; 
2550: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6a 6f 75      /* Which jou
2560: 72 6e 61 6c 20 69 6e 64 65 78 20 64 65 73 63 72  rnal index descr
2570: 69 62 65 73 20 70 61 67 65 20 6a 70 67 6e 6f 20  ibes page jpgno 
2580: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 64 78 5f 73  */.    int idx_s
2590: 6c 6f 74 3b 20 20 20 20 2f 2a 20 57 68 69 63 68  lot;    /* Which
25a0: 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20   entry in index 
25b0: 69 64 78 5f 6e 75 6d 20 64 65 73 63 72 69 62 65  idx_num describe
25c0: 73 20 6a 70 67 6e 6f 20 2a 2f 0a 20 20 20 20 50  s jpgno */.    P
25d0: 67 68 64 72 20 2a 70 49 64 78 50 67 3b 20 20 20  ghdr *pIdxPg;   
25e0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 70 61 67  /* The index pag
25f0: 65 20 66 6f 72 20 6a 70 67 6e 6f 20 2a 2f 0a 20  e for jpgno */. 
2600: 20 20 20 4a 69 64 78 45 6e 74 72 79 20 2a 61 49     JidxEntry *aI
2610: 64 78 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 20  dx; /* The data 
2620: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 70 61  for the index pa
2630: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b  ge */.    int h;
2640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2650: 65 20 68 61 73 68 20 76 61 6c 75 65 20 66 6f 72  e hash value for
2660: 20 70 50 67 2d 3e 64 62 70 67 6e 6f 20 2a 2f 0a   pPg->dbpgno */.
2670: 0a 20 20 20 20 6a 70 67 6e 6f 20 3d 20 70 2d 3e  .    jpgno = p->
2680: 6e 4a 50 67 20 2b 20 31 3b 0a 20 20 20 20 69 66  nJPg + 1;.    if
2690: 28 20 6a 70 67 6e 6f 20 25 20 28 4e 5f 4a 5f 44  ( jpgno % (N_J_D
26a0: 41 54 41 50 41 47 45 20 2b 20 31 29 20 3d 3d 20  ATAPAGE + 1) == 
26b0: 31 20 29 7b 0a 20 20 20 20 20 20 6a 70 67 6e 6f  1 ){.      jpgno
26c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64  ++;.    }.    id
26d0: 78 5f 6e 75 6d 20 3d 20 28 6a 70 67 6e 6f 20 2d  x_num = (jpgno -
26e0: 20 31 29 2f 28 4e 5f 4a 5f 44 41 54 41 50 41 47   1)/(N_J_DATAPAG
26f0: 45 20 2b 20 31 29 3b 0a 20 20 20 20 69 64 78 5f  E + 1);.    idx_
2700: 73 6c 6f 74 20 3d 20 28 6a 70 67 6e 6f 20 2d 20  slot = (jpgno - 
2710: 31 29 20 25 20 28 4e 5f 4a 5f 44 41 54 41 50 41  1) % (N_J_DATAPA
2720: 47 45 20 2b 20 31 29 20 2d 20 32 3b 0a 20 20 20  GE + 1) - 2;.   
2730: 20 70 49 64 78 50 67 20 3d 20 73 71 6c 69 74 65   pIdxPg = sqlite
2740: 50 67 46 69 6e 64 4a 69 64 78 28 70 2c 20 69 64  PgFindJidx(p, id
2750: 78 5f 6e 75 6d 20 2a 20 28 4e 5f 4a 5f 44 41 54  x_num * (N_J_DAT
2760: 41 50 41 47 45 20 2b 20 31 29 20 2b 20 31 29 3b  APAGE + 1) + 1);
2770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2780: 78 50 67 21 3d 30 20 29 3b 0a 20 20 20 20 61 49  xPg!=0 );.    aI
2790: 64 78 20 3d 20 50 47 5f 54 4f 5f 44 41 54 41 28  dx = PG_TO_DATA(
27a0: 70 49 64 78 50 67 29 3b 0a 20 20 20 20 73 71 6c  pIdxPg);.    sql
27b0: 69 74 65 50 67 50 75 74 49 6e 74 28 70 50 67 2d  itePgPutInt(pPg-
27c0: 3e 64 62 70 67 6e 6f 2c 20 61 49 64 78 5b 69 64  >dbpgno, aIdx[id
27d0: 78 5f 73 6c 6f 74 5d 2e 64 62 70 67 6e 6f 29 3b  x_slot].dbpgno);
27e0: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 64 62  .    h = pPg->db
27f0: 70 67 6e 6f 20 25 20 4a 5f 48 41 53 48 5f 53 49  pgno % J_HASH_SI
2800: 5a 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 50 67  ZE;.    sqlitePg
2810: 50 75 74 49 6e 74 28 70 2d 3e 61 4a 48 61 73 68  PutInt(p->aJHash
2820: 5b 68 5d 2c 20 61 49 64 78 5b 69 64 78 5f 73 6c  [h], aIdx[idx_sl
2830: 6f 74 5d 2e 6e 65 78 74 5f 6a 70 67 6e 6f 29 3b  ot].next_jpgno);
2840: 0a 20 20 20 20 70 2d 3e 61 4a 48 61 73 68 5b 68  .    p->aJHash[h
2850: 5d 20 3d 20 6a 70 67 6e 6f 3b 0a 20 20 20 20 70  ] = jpgno;.    p
2860: 2d 3e 6e 4a 50 67 20 3d 20 6a 70 67 6e 6f 3b 0a  ->nJPg = jpgno;.
2870: 20 20 20 20 70 50 67 2d 3e 6a 70 67 6e 6f 20 3d      pPg->jpgno =
2880: 20 6a 70 67 6e 6f 3b 0a 20 20 20 20 54 52 41 43   jpgno;.    TRAC
2890: 45 28 28 22 50 47 3a 20 61 73 73 69 67 6e 20 64  E(("PG: assign d
28a0: 2d 70 61 67 65 20 25 75 20 74 6f 20 6a 2d 70 61  -page %u to j-pa
28b0: 67 65 20 25 75 5c 6e 22 2c 20 6a 70 67 6e 6f 2c  ge %u\n", jpgno,
28c0: 20 70 50 67 2d 3e 64 62 70 67 6e 6f 29 29 3b 0a   pPg->dbpgno));.
28d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
28e0: 65 50 67 57 72 69 74 65 28 70 2d 3e 66 64 4a 6f  ePgWrite(p->fdJo
28f0: 75 72 6e 61 6c 2c 20 50 47 5f 54 4f 5f 44 41 54  urnal, PG_TO_DAT
2900: 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6a 70 67  A(pPg), pPg->jpg
2910: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  no);.  if( rc==S
2920: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2930: 70 50 67 2d 3e 69 73 44 69 72 74 79 20 3d 20 30  pPg->isDirty = 0
2940: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2950: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
2960: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2970: 61 67 65 73 20 69 6e 20 74 68 65 20 67 69 76 65  ages in the give
2980: 6e 20 66 69 6c 65 20 62 79 20 6d 65 61 73 75 72  n file by measur
2990: 69 6e 67 20 74 68 65 20 73 69 7a 65 0a 2a 2a 20  ing the size.** 
29a0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 52 65  of the file.  Re
29b0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
29c0: 69 73 20 61 6e 79 20 70 72 6f 62 6c 65 6d 2e 0a  is any problem..
29d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
29e0: 6c 69 74 65 50 67 50 61 67 65 43 6f 75 6e 74 28  litePgPageCount(
29f0: 69 6e 74 20 66 64 29 7b 0a 20 20 73 74 72 75 63  int fd){.  struc
2a00: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
2a10: 20 20 69 66 28 20 66 73 74 61 74 28 66 64 2c 20    if( fstat(fd, 
2a20: 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 20 72  &statbuf)!=0 ) r
2a30: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2a40: 6e 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  n statbuf.st_siz
2a50: 65 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e/SQLITE_PAGE_SI
2a60: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ZE;.}../*.** Thi
2a70: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
2a80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2a90: 74 72 61 6e 73 66 65 72 73 20 70 61 67 65 73 20  transfers pages 
2aa0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  from the.** jour
2ab0: 6e 61 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62  nal to the datab
2ac0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
2ad0: 6e 74 20 73 71 6c 69 74 65 50 67 4a 6f 75 72 6e  nt sqlitePgJourn
2ae0: 61 6c 50 6c 61 79 62 61 63 6b 28 50 67 72 20 2a  alPlayback(Pgr *
2af0: 70 29 7b 0a 20 20 50 67 68 64 72 20 2a 70 50 67  p){.  Pghdr *pPg
2b00: 3b 0a 20 20 4a 69 64 78 45 6e 74 72 79 20 2a 61  ;.  JidxEntry *a
2b10: 49 64 78 3b 0a 20 20 69 6e 74 20 6e 4a 70 67 3b  Idx;.  int nJpg;
2b20: 0a 20 20 69 6e 74 20 6a 70 67 6e 6f 20 3d 20 31  .  int jpgno = 1
2b30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2b40: 20 64 62 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72   dbpgno;.  int r
2b50: 63 3b 0a 20 20 63 68 61 72 20 69 64 78 5b 53 51  c;.  char idx[SQ
2b60: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  LITE_PAGE_SIZE];
2b70: 0a 20 20 63 68 61 72 20 70 67 62 75 66 5b 53 51  .  char pgbuf[SQ
2b80: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  LITE_PAGE_SIZE];
2b90: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
2ba0: 3e 66 64 4a 6f 75 72 6e 61 6c 3e 3d 30 20 29 3b  >fdJournal>=0 );
2bb0: 0a 20 20 6e 4a 70 67 20 3d 20 73 71 6c 69 74 65  .  nJpg = sqlite
2bc0: 50 67 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 66  PgPageCount(p->f
2bd0: 64 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 77 68 69  dJournal);.  whi
2be0: 6c 65 28 20 6a 70 67 6e 6f 3c 3d 6e 4a 70 67 20  le( jpgno<=nJpg 
2bf0: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
2c00: 74 65 50 67 52 65 61 64 28 70 2d 3e 66 64 4a 6f  tePgRead(p->fdJo
2c10: 75 72 6e 61 6c 2c 20 69 64 78 2c 20 6a 70 67 6e  urnal, idx, jpgn
2c20: 6f 2b 2b 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  o++) ) break;.  
2c30: 20 20 61 49 64 78 20 3d 20 28 4a 69 64 78 45 6e    aIdx = (JidxEn
2c40: 74 72 79 2a 29 69 64 78 3b 0a 20 20 20 20 66 6f  try*)idx;.    fo
2c50: 72 28 69 3d 30 3b 20 69 3c 4e 5f 4a 5f 44 41 54  r(i=0; i<N_J_DAT
2c60: 41 50 41 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  APAGE; i++){.   
2c70: 20 20 20 64 62 70 67 6e 6f 20 3d 20 73 71 6c 69     dbpgno = sqli
2c80: 74 65 50 67 47 65 74 49 6e 74 28 26 69 64 78 5b  tePgGetInt(&idx[
2c90: 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  i]);.      if( d
2ca0: 62 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  bpgno==0 ){.    
2cb0: 20 20 20 20 6a 70 67 6e 6f 20 3d 20 6e 4a 70 67      jpgno = nJpg
2cc0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  +1;.        brea
2cd0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2ce0: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 50 67 46   pPg = sqlitePgF
2cf0: 69 6e 64 28 70 2c 20 64 62 70 67 6e 6f 29 3b 0a  ind(p, dbpgno);.
2d00: 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b        if( pPg ){
2d10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d20: 6c 69 74 65 50 67 57 72 69 74 65 28 70 2d 3e 66  litePgWrite(p->f
2d30: 64 4d 61 69 6e 2c 20 50 47 5f 54 4f 5f 44 41 54  dMain, PG_TO_DAT
2d40: 41 28 70 50 67 29 2c 20 64 62 70 67 6e 6f 29 3b  A(pPg), dbpgno);
2d50: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2d60: 22 50 47 3a 20 63 6f 6d 6d 69 74 20 6a 2d 70 61  "PG: commit j-pa
2d70: 67 65 20 25 75 20 74 6f 20 64 2d 70 61 67 65 20  ge %u to d-page 
2d80: 25 75 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 5c 6e  %u from memory\n
2d90: 22 2c 6a 70 67 6e 6f 2c 64 62 70 67 6e 6f 29 29  ",jpgno,dbpgno))
2da0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2db0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2dc0: 74 65 50 67 52 65 61 64 28 70 2d 3e 66 64 4a 6f  tePgRead(p->fdJo
2dd0: 75 72 6e 61 6c 2c 20 70 67 62 75 66 2c 20 6a 70  urnal, pgbuf, jp
2de0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2df0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2e10: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2e20: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
2e30: 71 6c 69 74 65 50 67 57 72 69 74 65 28 70 2d 3e  qlitePgWrite(p->
2e40: 66 64 4d 61 69 6e 2c 20 70 67 62 75 66 2c 20 64  fdMain, pgbuf, d
2e50: 62 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  bpgno);.        
2e60: 54 52 41 43 45 28 28 22 50 47 3a 20 63 6f 6d 6d  TRACE(("PG: comm
2e70: 69 74 20 6a 2d 70 61 67 65 20 25 75 20 74 6f 20  it j-page %u to 
2e80: 64 2d 70 61 67 65 20 25 75 20 66 72 6f 6d 20 64  d-page %u from d
2e90: 69 73 6b 5c 6e 22 2c 6a 70 67 6e 6f 2c 64 62 70  isk\n",jpgno,dbp
2ea0: 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
2eb0: 20 20 20 20 20 6a 70 67 6e 6f 2b 2b 3b 0a 20 20       jpgno++;.  
2ec0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ed0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2f00: 54 52 41 43 45 28 28 22 50 47 3a 20 63 6f 6d 6d  TRACE(("PG: comm
2f10: 69 74 20 63 6f 6d 70 6c 65 74 65 2e 20 64 65 6c  it complete. del
2f20: 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
2f30: 6c 2e 5c 6e 22 29 29 3b 0a 20 20 66 73 79 6e 63  l.\n"));.  fsync
2f40: 28 70 2d 3e 66 64 4d 61 69 6e 29 3b 0a 20 20 63  (p->fdMain);.  c
2f50: 6c 6f 73 65 28 70 2d 3e 66 64 4a 6f 75 72 6e 61  lose(p->fdJourna
2f60: 6c 29 3b 0a 20 20 70 2d 3e 66 64 4a 6f 75 72 6e  l);.  p->fdJourn
2f70: 61 6c 20 3d 20 2d 31 3b 0a 20 20 75 6e 6c 69 6e  al = -1;.  unlin
2f80: 6b 28 70 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  k(p->zJournal);.
2f90: 20 20 66 6f 72 28 70 50 67 3d 70 2d 3e 70 41 6c    for(pPg=p->pAl
2fa0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
2fb0: 3e 70 4e 78 29 7b 0a 20 20 20 20 70 50 67 2d 3e  >pNx){.    pPg->
2fc0: 69 73 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  isDirty = 0;.   
2fd0: 20 70 50 67 2d 3e 6a 70 67 6e 6f 20 3d 20 30 3b   pPg->jpgno = 0;
2fe0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 70  .  }.  while( (p
2ff0: 50 67 20 3d 20 70 2d 3e 70 4a 69 64 78 29 21 3d  Pg = p->pJidx)!=
3000: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 6c 6c  0 ){.    p->pAll
3010: 20 3d 20 70 50 67 2d 3e 70 4e 78 3b 0a 20 20 20   = pPg->pNx;.   
3020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
3030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
3040: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3050: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
3060: 76 65 6e 20 70 61 67 65 20 66 72 6f 6d 20 74 68  ven page from th
3070: 65 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  e LRU list..*/.s
3080: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
3090: 65 50 67 55 6e 6c 69 6e 6b 4c 72 75 28 50 67 68  ePgUnlinkLru(Pgh
30a0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 72 20  dr *pPg){.  Pgr 
30b0: 2a 70 20 3d 20 70 50 67 2d 3e 70 3b 0a 20 20 69  *p = pPg->p;.  i
30c0: 66 28 20 70 50 67 2d 3e 70 4c 72 75 20 29 7b 0a  f( pPg->pLru ){.
30d0: 20 20 20 20 70 50 67 2d 3e 70 4c 72 75 2d 3e 70      pPg->pLru->p
30e0: 4d 72 75 20 3d 20 70 50 67 2d 3e 70 4c 72 75 3b  Mru = pPg->pLru;
30f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
3100: 70 4d 72 75 20 29 7b 0a 20 20 20 20 70 50 67 2d  pMru ){.    pPg-
3110: 3e 70 4d 72 75 2d 3e 70 4c 72 75 20 3d 20 70 50  >pMru->pLru = pP
3120: 67 2d 3e 70 4d 72 75 3b 0a 20 20 7d 0a 20 20 69  g->pMru;.  }.  i
3130: 66 28 20 70 2d 3e 70 4c 72 75 3d 3d 70 50 67 20  f( p->pLru==pPg 
3140: 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 72 75 20 3d  ){.    p->pLru =
3150: 20 70 50 67 2d 3e 70 4c 72 75 3b 0a 20 20 7d 0a   pPg->pLru;.  }.
3160: 20 20 69 66 28 20 70 2d 3e 70 4d 72 75 3d 3d 70    if( p->pMru==p
3170: 50 67 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4d 72  Pg ){.    p->pMr
3180: 75 20 3d 20 70 50 67 2d 3e 70 4d 72 75 3b 0a 20  u = pPg->pMru;. 
3190: 20 7d 0a 20 20 70 50 67 2d 3e 70 4c 72 75 20 3d   }.  pPg->pLru =
31a0: 20 70 50 67 2d 3e 70 4d 72 75 20 3d 20 30 3b 0a   pPg->pMru = 0;.
31b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
31c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31d0: 61 6e 64 20 6d 61 6b 65 20 2a 70 70 50 67 72 20  and make *ppPgr 
31e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
31f0: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 69 6e  ucture describin
3200: 67 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  g it..** Return 
3210: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
3220: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
3230: 20 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69   code if there i
3240: 73 20 61 20 66 61 69 6c 75 72 65 2e 0a 2a 2a 0a  s a failure..**.
3250: 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
3260: 61 6e 20 75 6e 66 69 6e 69 73 68 65 64 20 63 6f  an unfinished co
3270: 6d 6d 69 74 2c 20 63 6f 6d 70 6c 65 74 65 20 69  mmit, complete i
3280: 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 6e  t before returnn
3290: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
32a0: 74 65 50 67 4f 70 65 6e 28 63 6f 6e 73 74 20 63  tePgOpen(const c
32b0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
32c0: 50 67 72 20 2a 2a 70 70 50 67 72 29 7b 0a 20 20  Pgr **ppPgr){.  
32d0: 50 67 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  Pgr *p;.  int n;
32e0: 0a 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ..  n = strlen(z
32f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 20 3d  Filename);.  p =
3300: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3310: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 2a 32 20  izeof(*p) + n*2 
3320: 2b 20 34 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  + 4 );.  if( p==
3330: 30 20 29 7b 0a 20 20 20 20 2a 70 70 50 67 72 20  0 ){.    *ppPgr 
3340: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
3350: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3360: 7d 0a 20 20 70 2d 3e 7a 4d 61 69 6e 20 3d 20 28  }.  p->zMain = (
3370: 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 73  char*)&p[1];.  s
3380: 74 72 63 70 79 28 70 2d 3e 7a 4d 61 69 6e 2c 20  trcpy(p->zMain, 
3390: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 2d  zFilename);.  p-
33a0: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 2d 3e  >zJournal = &p->
33b0: 7a 4d 61 69 6e 5b 6e 2b 31 5d 3b 0a 20 20 73 74  zMain[n+1];.  st
33c0: 72 63 70 79 28 70 2d 3e 7a 4a 6f 75 72 6e 61 6c  rcpy(p->zJournal
33d0: 2c 20 70 2d 3e 7a 4d 61 69 6e 29 3b 0a 20 20 70  , p->zMain);.  p
33e0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 5d 20 3d 20  ->zJournal[n] = 
33f0: 27 7e 27 3b 0a 20 20 70 2d 3e 7a 4a 6f 75 72 6e  '~';.  p->zJourn
3400: 61 6c 5b 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  al[n+1] = 0;.  p
3410: 2d 3e 66 64 4a 6f 75 72 6e 61 6c 20 3d 20 2d 31  ->fdJournal = -1
3420: 3b 0a 20 20 70 2d 3e 66 64 4d 61 69 6e 20 3d 20  ;.  p->fdMain = 
3430: 6f 70 65 6e 28 70 2d 3e 7a 4d 61 69 6e 2c 20 4f  open(p->zMain, O
3440: 5f 43 52 45 41 54 7c 4f 5f 52 44 57 52 2c 20 30  _CREAT|O_RDWR, 0
3450: 36 30 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66  600);.  if( p->f
3460: 64 4d 61 69 6e 3c 30 20 29 7b 0a 20 20 20 20 2a  dMain<0 ){.    *
3470: 70 70 50 67 72 20 3d 20 30 3b 0a 20 20 20 20 73  ppPgr = 0;.    s
3480: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
3490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34a0: 50 45 52 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  PERM;.  }.  p->n
34b0: 44 62 50 67 20 3d 20 73 71 6c 69 74 65 50 67 50  DbPg = sqlitePgP
34c0: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 66 64 4d 61  ageCount(p->fdMa
34d0: 69 6e 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73  in);.  if( acces
34e0: 73 28 70 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 52  s(p->zJournal, R
34f0: 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  _OK)==0 ){.    s
3500: 71 6c 69 74 65 50 67 4a 6f 75 72 6e 61 6c 50 6c  qlitePgJournalPl
3510: 61 79 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20  ayback(p);.  }. 
3520: 20 2a 70 70 50 67 72 20 3d 20 70 3b 0a 20 20 72   *ppPgr = p;.  r
3530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
3550: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3560: 65 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  e.  Any outstand
3570: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
3580: 20 61 72 65 20 61 62 61 6e 64 6f 6e 65 64 2e 0a   are abandoned..
3590: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 50 67 43  */.int sqlitePgC
35a0: 6c 6f 73 65 28 50 67 72 20 2a 70 29 7b 0a 20 20  lose(Pgr *p){.  
35b0: 50 67 68 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  Pghdr *pPg;..  i
35c0: 66 28 20 70 2d 3e 66 64 4d 61 69 6e 20 29 20 63  f( p->fdMain ) c
35d0: 6c 6f 73 65 28 70 2d 3e 66 64 4d 61 69 6e 29 3b  lose(p->fdMain);
35e0: 0a 20 20 69 66 28 20 70 2d 3e 66 64 4a 6f 75 72  .  if( p->fdJour
35f0: 6e 61 6c 20 29 20 63 6c 6f 73 65 28 70 2d 3e 66  nal ) close(p->f
3600: 64 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 75 6e 6c  dJournal);.  unl
3610: 69 6e 6b 28 70 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  ink(p->zJournal)
3620: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
3630: 3d 20 70 2d 3e 70 41 6c 6c 29 21 3d 30 20 29 7b  = p->pAll)!=0 ){
3640: 0a 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70  .    p->pAll = p
3650: 50 67 2d 3e 70 4e 78 3b 0a 20 20 20 20 73 71 6c  Pg->pNx;.    sql
3660: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
3670: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  }.  while( (pPg 
3680: 3d 20 70 2d 3e 70 4a 69 64 78 29 21 3d 30 20 29  = p->pJidx)!=0 )
3690: 7b 0a 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20  {.    p->pAll = 
36a0: 70 50 67 2d 3e 70 4e 78 3b 0a 20 20 20 20 73 71  pPg->pNx;.    sq
36b0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
36c0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
36d0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
36e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
36f0: 20 42 65 67 69 6e 20 61 20 6e 65 77 20 74 72 61   Begin a new tra
3700: 6e 73 61 63 74 69 6f 6e 2e 20 20 52 65 74 75 72  nsaction.  Retur
3710: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
3720: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
3730: 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 66 20 73 6f  or.** code if so
3740: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3750: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
3760: 65 50 67 42 65 67 69 6e 54 72 61 6e 73 61 63 74  ePgBeginTransact
3770: 69 6f 6e 28 50 67 72 20 2a 70 29 7b 0a 20 20 61  ion(Pgr *p){.  a
3780: 73 73 65 72 74 28 20 70 2d 3e 66 64 4a 6f 75 72  ssert( p->fdJour
3790: 6e 61 6c 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  nal<0 );.  if( p
37a0: 2d 3e 6e 52 65 66 50 67 3e 30 20 29 7b 0a 20 20  ->nRefPg>0 ){.  
37b0: 20 20 20 2f 2a 20 72 65 6c 65 61 73 65 20 74 68     /* release th
37c0: 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
37d0: 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 6c 6f   }.  /* write lo
37e0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
37f0: 2a 2f 0a 20 20 70 2d 3e 66 64 4a 6f 75 72 6e 61  */.  p->fdJourna
3800: 6c 20 3d 20 6f 70 65 6e 28 70 2d 3e 7a 4a 6f 75  l = open(p->zJou
3810: 72 6e 61 6c 2c 20 4f 5f 43 52 45 41 54 7c 4f 5f  rnal, O_CREAT|O_
3820: 45 58 43 4c 7c 4f 5f 52 44 57 52 2c 20 30 36 30  EXCL|O_RDWR, 060
3830: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66 64 4a  0);.  if( p->fdJ
3840: 6f 75 72 6e 61 6c 3c 30 20 29 7b 0a 20 20 20 20  ournal<0 ){.    
3850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
3860: 52 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4a 50  RM;.  }.  p->nJP
3870: 67 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 28 28  g = 0;.  TRACE((
3880: 22 50 47 3a 20 62 65 67 69 6e 20 74 72 61 6e 73  "PG: begin trans
3890: 61 63 74 69 6f 6e 5c 6e 22 29 29 3b 0a 20 20 72  action\n"));.  r
38a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
38b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
38c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
38d0: 6e 73 61 63 74 69 6f 6e 2e 20 20 52 65 74 75 72  nsaction.  Retur
38e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61  n SQLITE_OK or a
38f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
3900: 0a 69 6e 74 20 73 71 6c 69 74 65 50 67 43 6f 6d  .int sqlitePgCom
3910: 6d 69 74 28 50 67 72 20 2a 70 29 7b 0a 20 20 50  mit(Pgr *p){.  P
3920: 67 68 64 72 20 2a 70 50 72 69 6d 61 72 79 49 64  ghdr *pPrimaryId
3930: 78 20 3d 20 30 3b 0a 20 20 50 67 68 64 72 20 2a  x = 0;.  Pghdr *
3940: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
3950: 20 20 66 6f 72 28 70 50 67 3d 70 2d 3e 70 41 6c    for(pPg=p->pAl
3960: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
3970: 3e 70 4e 78 29 7b 0a 20 20 20 20 69 66 28 20 70  >pNx){.    if( p
3980: 50 67 2d 3e 69 73 44 69 72 74 79 20 29 7b 0a 20  Pg->isDirty ){. 
3990: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
39a0: 50 67 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  PgMakeClean(pPg)
39b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
39c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
39d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
39e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
39f0: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 2d 3e 70  }.  for(pPg=p->p
3a00: 4a 69 64 78 3b 20 70 50 67 3b 20 70 50 67 3d 70  Jidx; pPg; pPg=p
3a10: 50 67 2d 3e 70 4e 78 29 7b 0a 20 20 20 20 69 66  Pg->pNx){.    if
3a20: 28 20 70 50 67 2d 3e 6a 70 67 6e 6f 3d 3d 31 20  ( pPg->jpgno==1 
3a30: 29 7b 0a 20 20 20 20 20 20 70 50 72 69 6d 61 72  ){.      pPrimar
3a40: 79 49 64 78 20 3d 20 70 50 67 3b 0a 20 20 20 20  yIdx = pPg;.    
3a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
3a60: 43 45 28 28 22 50 47 3a 20 77 72 69 74 69 6e 67  CE(("PG: writing
3a70: 20 6a 2d 69 6e 64 65 78 20 25 75 5c 6e 22 2c 20   j-index %u\n", 
3a80: 70 50 67 2d 3e 6a 70 67 6e 6f 29 29 3b 0a 20 20  pPg->jpgno));.  
3a90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 50      rc = sqliteP
3aa0: 67 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  gMakeClean(pPg);
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
3ac0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3ad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3ae0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3af0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6d  .  assert( pPrim
3b00: 61 72 79 49 64 78 21 3d 30 20 29 3b 0a 20 20 66  aryIdx!=0 );.  f
3b10: 73 79 6e 63 28 70 2d 3e 66 64 4a 6f 75 72 6e 61  sync(p->fdJourna
3b20: 6c 29 3b 0a 20 20 54 52 41 43 45 28 28 22 50 47  l);.  TRACE(("PG
3b30: 3a 20 77 72 69 74 69 6e 67 20 6a 2d 69 6e 64 65  : writing j-inde
3b40: 78 20 25 75 5c 6e 22 2c 20 70 50 72 69 6d 61 72  x %u\n", pPrimar
3b50: 79 49 64 78 2d 3e 6a 70 67 6e 6f 29 29 3b 0a 20  yIdx->jpgno));. 
3b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 50 67 4d 61   rc = sqlitePgMa
3b70: 6b 65 43 6c 65 61 6e 28 70 50 72 69 6d 61 72 79  keClean(pPrimary
3b80: 49 64 78 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Idx);.  if( rc!=
3b90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3ba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
3bb0: 20 20 66 73 79 6e 63 28 70 2d 3e 66 64 4a 6f 75    fsync(p->fdJou
3bc0: 72 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  rnal);.  rc = sq
3bd0: 6c 69 74 65 50 67 4a 6f 75 72 6e 61 6c 50 6c 61  litePgJournalPla
3be0: 79 62 61 63 6b 28 70 29 3b 0a 20 20 69 66 28 20  yback(p);.  if( 
3bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3c00: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
3c10: 20 20 7d 0a 20 20 2f 2a 20 72 65 6d 6f 76 65 20    }.  /* remove 
3c20: 77 72 69 74 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  write lock from 
3c30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
3c40: 28 20 70 2d 3e 6e 52 65 66 50 67 3e 30 20 29 7b  ( p->nRefPg>0 ){
3c50: 0a 20 20 20 20 2f 2a 20 61 63 71 75 69 72 65 20  .    /* acquire 
3c60: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 64 61 74  read lock on dat
3c70: 61 62 61 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 72  abase */.  }.  r
3c80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 62 61 6e 64 6f  .}../*.** Abando
3ca0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
3cb0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
3cc0: 74 20 73 71 6c 69 74 65 50 67 52 6f 6c 6c 62 61  t sqlitePgRollba
3cd0: 63 6b 28 50 67 72 20 2a 70 29 7b 0a 20 20 50 67  ck(Pgr *p){.  Pg
3ce0: 68 64 72 20 2a 70 50 67 3b 0a 0a 20 20 54 52 41  hdr *pPg;..  TRA
3cf0: 43 45 28 28 22 50 47 3a 20 62 65 67 69 6e 20 72  CE(("PG: begin r
3d00: 6f 6c 6c 62 61 63 6b 5c 6e 22 29 29 3b 0a 20 20  ollback\n"));.  
3d10: 66 6f 72 28 70 50 67 3d 70 2d 3e 70 41 6c 6c 3b  for(pPg=p->pAll;
3d20: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
3d30: 4e 78 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Nx){.    if( pPg
3d40: 2d 3e 69 73 44 69 72 74 79 20 7c 7c 20 70 50 67  ->isDirty || pPg
3d50: 2d 3e 6a 70 67 6e 6f 21 3d 30 20 29 7b 0a 20 20  ->jpgno!=0 ){.  
3d60: 20 20 20 20 70 50 67 2d 3e 69 73 44 69 72 74 79      pPg->isDirty
3d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
3d80: 3e 6a 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  >jpgno = 0;.    
3d90: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e    if( pPg->nRef>
3da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 52 41  0 ){.        TRA
3db0: 43 45 28 28 22 50 47 3a 20 72 65 6c 6f 61 64 69  CE(("PG: reloadi
3dc0: 6e 67 20 64 2d 70 61 67 65 20 25 75 5c 6e 22 2c  ng d-page %u\n",
3dd0: 20 70 50 67 2d 3e 64 62 70 67 6e 6f 29 29 3b 0a   pPg->dbpgno));.
3de0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 50 67          sqlitePg
3df0: 52 65 61 64 28 70 2d 3e 66 64 4d 61 69 6e 2c 20  Read(p->fdMain, 
3e00: 50 47 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  PG_TO_DATA(pPg),
3e10: 20 70 50 67 2d 3e 64 62 70 67 6e 6f 29 3b 0a 20   pPg->dbpgno);. 
3e20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3e30: 20 20 20 20 73 71 6c 69 74 65 50 67 55 6e 6c 69      sqlitePgUnli
3e40: 6e 6b 4c 72 75 28 70 50 67 29 3b 0a 20 20 20 20  nkLru(pPg);.    
3e50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3e60: 63 6c 6f 73 65 28 70 2d 3e 66 64 4a 6f 75 72 6e  close(p->fdJourn
3e70: 61 6c 29 3b 0a 20 20 70 2d 3e 66 64 4a 6f 75 72  al);.  p->fdJour
3e80: 6e 61 6c 20 3d 20 2d 31 3b 0a 20 20 75 6e 6c 69  nal = -1;.  unli
3e90: 6e 6b 28 70 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  nk(p->zJournal);
3ea0: 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
3eb0: 20 70 2d 3e 70 4a 69 64 78 29 21 3d 30 20 29 7b   p->pJidx)!=0 ){
3ec0: 0a 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70  .    p->pAll = p
3ed0: 50 67 2d 3e 70 4e 78 3b 0a 20 20 20 20 73 71 6c  Pg->pNx;.    sql
3ee0: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
3ef0: 7d 0a 20 20 70 2d 3e 6e 44 62 50 67 20 3d 20 73  }.  p->nDbPg = s
3f00: 71 6c 69 74 65 50 67 50 61 67 65 43 6f 75 6e 74  qlitePgPageCount
3f10: 28 70 2d 3e 66 64 4d 61 69 6e 29 3b 0a 20 20 2f  (p->fdMain);.  /
3f20: 2a 20 72 65 6d 6f 76 65 20 77 72 69 74 65 20 6c  * remove write l
3f30: 6f 63 6b 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ock from databas
3f40: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 52  e */.  if( p->nR
3f50: 65 66 50 67 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  efPg>0 ){.    /*
3f60: 20 61 63 71 75 69 72 65 20 72 65 61 64 20 6c 6f   acquire read lo
3f70: 63 6b 20 6f 6e 20 64 61 74 61 62 61 73 65 20 2a  ck on database *
3f80: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
3f90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3fa0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
3fb0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
3fc0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
3fd0: 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
3fe0: 6f 72 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  or that.** page.
3ff0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 6f  .**.** A NULL po
4000: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 72 65  inter will be re
4010: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
4020: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
4030: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 50 67 47  */.int sqlitePgG
4040: 65 74 28 50 67 72 20 2a 70 2c 20 75 33 32 20 70  et(Pgr *p, u32 p
4050: 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 44 61  gno, void **ppDa
4060: 74 61 29 7b 0a 20 20 50 67 68 64 72 20 2a 70 50  ta){.  Pghdr *pP
4070: 67 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 70  g;.  int h;..  p
4080: 50 67 20 3d 20 73 71 6c 69 74 65 50 67 46 69 6e  Pg = sqlitePgFin
4090: 64 28 70 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  d(p, pgno);.  if
40a0: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 70 50 67  ( pPg ){.    pPg
40b0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66  ->nRef++;.    if
40c0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 31 20 29  ( pPg->nRef==1 )
40d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 67  {.      sqlitePg
40e0: 55 6e 6c 69 6e 6b 4c 72 75 28 70 50 67 29 3b 0a  UnlinkLru(pPg);.
40f0: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 50 47        TRACE(("PG
4100: 3a 20 64 2d 70 61 67 65 20 25 75 20 70 75 6c 6c  : d-page %u pull
4110: 65 64 20 66 72 6f 6d 20 63 61 63 68 65 5c 6e 22  ed from cache\n"
4120: 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
4130: 20 20 20 20 70 2d 3e 6e 52 65 66 50 67 2b 2b 3b      p->nRefPg++;
4140: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
4150: 50 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Pg==1 ){.      /
4160: 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
4170: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 7d 0a 20   lock */.    }. 
4180: 20 20 20 2a 70 70 44 61 74 61 20 3d 20 50 47 5f     *ppData = PG_
4190: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
41a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
41b0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  OK;.  }.  if( p-
41c0: 3e 6e 4d 65 6d 50 67 3c 4d 58 5f 4d 45 4d 5f 50  >nMemPg<MX_MEM_P
41d0: 41 47 45 20 7c 7c 20 70 2d 3e 70 4c 72 75 3d 3d  AGE || p->pLru==
41e0: 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 73  0 ){.    pPg = s
41f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4200: 65 6f 66 28 50 67 68 64 72 29 20 2b 20 53 51 4c  eof(Pghdr) + SQL
4210: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  ITE_PAGE_SIZE );
4220: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
4230: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
4240: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 2d 3e 6e 4d  NOMEM;.    p->nM
4250: 65 6d 50 67 2b 2b 3b 0a 20 20 20 20 70 50 67 2d  emPg++;.    pPg-
4260: 3e 70 4e 78 20 3d 20 70 2d 3e 70 41 6c 6c 3b 0a  >pNx = p->pAll;.
4270: 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50      p->pAll = pP
4280: 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 20 3d 20  g;.    pPg->p = 
4290: 70 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  p;.    TRACE(("P
42a0: 47 3a 20 6e 65 77 20 70 61 67 65 20 25 64 20 63  G: new page %d c
42b0: 72 65 61 74 65 64 2e 5c 6e 22 2c 20 70 2d 3e 6e  reated.\n", p->n
42c0: 4d 65 6d 50 67 29 29 3b 0a 20 20 7d 65 6c 73 65  MemPg));.  }else
42d0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
42e0: 20 20 70 50 67 20 3d 20 70 2d 3e 70 4c 72 75 3b    pPg = p->pLru;
42f0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 69 73  .    if( pPg->is
4300: 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 72  Dirty ){.      r
4310: 63 20 3d 20 73 71 6c 69 74 65 50 67 4d 61 6b 65  c = sqlitePgMake
4320: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
4330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4340: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
4350: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4360: 65 50 67 55 6e 6c 69 6e 6b 4c 72 75 28 70 50 67  ePgUnlinkLru(pPg
4370: 29 3b 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e  );.    h = pPg->
4380: 64 62 70 67 6e 6f 20 25 20 50 47 5f 48 41 53 48  dbpgno % PG_HASH
4390: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 70  _SIZE;.    if( p
43a0: 50 67 2d 3e 70 50 76 48 61 73 68 20 29 7b 0a 20  Pg->pPvHash ){. 
43b0: 20 20 20 20 20 70 50 67 2d 3e 70 50 76 48 61 73       pPg->pPvHas
43c0: 68 2d 3e 70 4e 78 48 61 73 68 20 3d 20 70 50 67  h->pNxHash = pPg
43d0: 2d 3e 70 4e 78 48 61 73 68 3b 0a 20 20 20 20 7d  ->pNxHash;.    }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
43f0: 72 74 28 20 70 2d 3e 61 50 67 48 61 73 68 5b 68  rt( p->aPgHash[h
4400: 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  ]==pPg );.      
4410: 70 2d 3e 61 50 67 48 61 73 68 5b 68 5d 20 3d 20  p->aPgHash[h] = 
4420: 70 50 67 2d 3e 70 4e 78 48 61 73 68 3b 0a 20 20  pPg->pNxHash;.  
4430: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
4440: 3e 70 4e 78 48 61 73 68 20 29 7b 0a 20 20 20 20  >pNxHash ){.    
4450: 20 20 70 50 67 2d 3e 70 4e 78 48 61 73 68 2d 3e    pPg->pNxHash->
4460: 70 50 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  pPvHash = pPg->p
4470: 50 76 48 61 73 68 3b 0a 20 20 20 20 7d 0a 20 20  PvHash;.    }.  
4480: 20 20 54 52 41 43 45 28 28 22 50 47 3a 20 72 65    TRACE(("PG: re
4490: 63 79 63 6c 69 6e 67 20 64 2d 70 61 67 65 20 25  cycling d-page %
44a0: 75 20 74 6f 20 64 2d 70 61 67 65 20 25 75 5c 6e  u to d-page %u\n
44b0: 22 2c 20 70 50 67 2d 3e 64 62 70 67 6e 6f 2c 20  ", pPg->dbpgno, 
44c0: 70 67 6e 6f 29 29 3b 0a 20 20 7d 0a 20 20 70 50  pgno));.  }.  pP
44d0: 67 2d 3e 64 62 70 67 6e 6f 20 3d 20 70 67 6e 6f  g->dbpgno = pgno
44e0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 2d 3e  ;.  if( pgno>p->
44f0: 6e 44 62 50 67 20 29 7b 0a 20 20 20 20 70 2d 3e  nDbPg ){.    p->
4500: 6e 44 62 50 67 20 3d 20 70 67 6e 6f 3b 0a 20 20  nDbPg = pgno;.  
4510: 7d 0a 20 20 68 20 3d 20 70 67 6e 6f 20 25 20 50  }.  h = pgno % P
4520: 47 5f 48 41 53 48 5f 53 49 5a 45 3b 0a 20 20 70  G_HASH_SIZE;.  p
4530: 50 67 2d 3e 70 50 76 48 61 73 68 20 3d 20 30 3b  Pg->pPvHash = 0;
4540: 0a 20 20 70 50 67 2d 3e 70 4e 78 48 61 73 68 20  .  pPg->pNxHash 
4550: 3d 20 70 2d 3e 61 50 67 48 61 73 68 5b 68 5d 3b  = p->aPgHash[h];
4560: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 78 48  .  if( pPg->pNxH
4570: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
4580: 70 4e 78 48 61 73 68 2d 3e 70 50 76 48 61 73 68  pNxHash->pPvHash
4590: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 2d   = pPg;.  }.  p-
45a0: 3e 61 50 67 48 61 73 68 5b 68 5d 20 3d 20 70 50  >aPgHash[h] = pP
45b0: 67 3b 0a 20 20 70 50 67 2d 3e 6a 70 67 6e 6f 20  g;.  pPg->jpgno 
45c0: 3d 20 73 71 6c 69 74 65 50 67 4a 6f 75 72 6e 61  = sqlitePgJourna
45d0: 6c 50 61 67 65 4e 75 6d 62 65 72 28 70 2c 20 70  lPageNumber(p, p
45e0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  gno);.  if( pPg-
45f0: 3e 6a 70 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20  >jpgno!=0 ){.   
4600: 20 54 52 41 43 45 28 28 22 50 47 3a 20 72 65 61   TRACE(("PG: rea
4610: 64 69 6e 67 20 64 2d 70 61 67 65 20 25 75 20 63  ding d-page %u c
4620: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 6a 2d 70 61  ontent from j-pa
4630: 67 65 20 25 75 5c 6e 22 2c 20 70 67 6e 6f 2c 20  ge %u\n", pgno, 
4640: 70 50 67 2d 3e 6a 70 67 6e 6f 29 29 3b 0a 20 20  pPg->jpgno));.  
4650: 20 20 73 71 6c 69 74 65 50 67 52 65 61 64 28 70    sqlitePgRead(p
4660: 2d 3e 66 64 4a 6f 75 72 6e 61 6c 2c 20 50 47 5f  ->fdJournal, PG_
4670: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
4680: 67 2d 3e 6a 70 67 6e 6f 29 3b 0a 20 20 7d 65 6c  g->jpgno);.  }el
4690: 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22  se{.    TRACE(("
46a0: 50 47 3a 20 72 65 61 64 69 6e 67 20 64 2d 70 61  PG: reading d-pa
46b0: 67 65 20 25 75 20 66 72 6f 6d 20 64 61 74 61 62  ge %u from datab
46c0: 61 73 65 5c 6e 22 2c 20 70 67 6e 6f 29 29 3b 0a  ase\n", pgno));.
46d0: 20 20 20 20 73 71 6c 69 74 65 50 67 52 65 61 64      sqlitePgRead
46e0: 28 70 2d 3e 66 64 4d 61 69 6e 2c 20 50 47 5f 54  (p->fdMain, PG_T
46f0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
4700: 2d 3e 64 62 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ->dbpgno);.  }. 
4710: 20 70 50 67 2d 3e 69 73 44 69 72 74 79 20 3d 20   pPg->isDirty = 
4720: 30 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  0;.  pPg->nRef =
4730: 20 31 3b 0a 20 20 70 2d 3e 6e 52 65 66 50 67 2b   1;.  p->nRefPg+
4740: 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  +;.  if( p->nRef
4750: 50 67 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==1 ){.    /* 
4760: 41 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c  Acquire a read l
4770: 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 2a 70 70  ock */.  }.  *pp
4780: 44 61 74 61 20 3d 20 50 47 5f 54 4f 5f 44 41 54  Data = PG_TO_DAT
4790: 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
47a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
47b0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
47c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 64 61  eference to a da
47d0: 74 61 62 61 73 65 20 64 61 74 61 20 70 61 67 65  tabase data page
47e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 50  ..*/.int sqliteP
47f0: 67 55 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  gUnref(void *pDa
4800: 74 61 29 7b 0a 20 20 50 67 68 64 72 20 2a 70 50  ta){.  Pghdr *pP
4810: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 28 70  g = DATA_TO_PG(p
4820: 44 61 74 61 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  Data);.  pPg->nR
4830: 65 66 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20  ef--;.  assert( 
4840: 70 50 67 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  pPg->nRef>=0 );.
4850: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
4860: 3d 30 20 29 7b 0a 20 20 20 20 50 67 72 20 2a 70  =0 ){.    Pgr *p
4870: 20 3d 20 70 50 67 2d 3e 70 3b 0a 20 20 20 20 70   = pPg->p;.    p
4880: 50 67 2d 3e 70 4d 72 75 20 3d 20 30 3b 0a 20 20  Pg->pMru = 0;.  
4890: 20 20 70 50 67 2d 3e 70 4c 72 75 20 3d 20 70 2d    pPg->pLru = p-
48a0: 3e 70 4c 72 75 3b 0a 20 20 20 20 70 2d 3e 70 4c  >pLru;.    p->pL
48b0: 72 75 20 3d 20 70 50 67 3b 0a 20 20 20 20 54 52  ru = pPg;.    TR
48c0: 41 43 45 28 28 22 50 47 3a 20 64 2d 70 61 67 65  ACE(("PG: d-page
48d0: 20 25 75 20 69 73 20 75 6e 75 73 65 64 5c 6e 22   %u is unused\n"
48e0: 2c 20 70 50 67 2d 3e 64 62 70 67 6e 6f 29 29 3b  , pPg->dbpgno));
48f0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 50 67 2d 2d  .    p->nRefPg--
4900: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
4910: 66 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fPg==0 ){.      
4920: 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
4930: 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
4940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4950: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4960: 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
4970: 70 61 67 65 20 69 6e 20 74 68 65 20 61 72 67 75  page in the argu
4980: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 6d 6f  ment has been mo
4990: 64 69 66 69 65 64 2e 20 20 57 72 69 74 65 20 69  dified.  Write i
49a0: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  t back.** to the
49b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
49c0: 6e 20 74 68 65 20 6e 65 78 74 20 63 6f 6d 6d 69  n the next commi
49d0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
49e0: 50 67 54 6f 75 63 68 28 76 6f 69 64 20 2a 70 44  PgTouch(void *pD
49f0: 29 7b 0a 20 20 50 67 68 64 72 20 2a 70 50 67 20  ){.  Pghdr *pPg 
4a00: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 28 70 44 29  = DATA_TO_PG(pD)
4a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
4a20: 3e 70 2d 3e 66 64 4a 6f 75 72 6e 61 6c 3e 3d 30  >p->fdJournal>=0
4a30: 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   );.  if( pPg->i
4a40: 73 44 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  sDirty==0 ){.   
4a50: 20 70 50 67 2d 3e 69 73 44 69 72 74 79 20 3d 20   pPg->isDirty = 
4a60: 31 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  1;.    TRACE(("P
4a70: 47 3a 20 64 2d 70 61 67 65 20 25 75 20 69 73 20  G: d-page %u is 
4a80: 64 69 72 74 79 5c 6e 22 2c 20 70 50 67 2d 3e 64  dirty\n", pPg->d
4a90: 62 70 67 6e 6f 29 29 3b 0a 20 20 7d 0a 20 20 72  bpgno));.  }.  r
4aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4ac0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
4ad0: 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
4ae0: 70 61 67 65 20 61 74 20 74 68 65 20 65 6e 64 20  page at the end 
4af0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
4b00: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  se file..*/.int 
4b10: 73 71 6c 69 74 65 50 67 41 6c 6c 6f 63 28 50 67  sqlitePgAlloc(Pg
4b20: 72 20 2a 70 2c 20 75 33 32 20 2a 70 50 67 6e 6f  r *p, u32 *pPgno
4b30: 29 7b 0a 20 20 2a 70 50 67 6e 6f 20 3d 20 70 2d  ){.  *pPgno = p-
4b40: 3e 6e 44 62 50 67 3b 0a 20 20 72 65 74 75 72 6e  >nDbPg;.  return
4b50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4b60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4b70: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 73 6f  page number asso
4b80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4b90: 67 69 76 65 6e 20 70 61 67 65 2e 0a 2a 2f 0a 75  given page..*/.u
4ba0: 33 32 20 73 71 6c 69 74 65 50 67 4e 75 6d 28 76  32 sqlitePgNum(v
4bb0: 6f 69 64 20 2a 70 44 29 7b 0a 20 20 50 67 68 64  oid *pD){.  Pghd
4bc0: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
4bd0: 5f 50 47 28 70 44 29 3b 0a 20 20 72 65 74 75 72  _PG(pD);.  retur
4be0: 6e 20 70 50 67 2d 3e 64 62 70 67 6e 6f 3b 0a 7d  n pPg->dbpgno;.}
4bf0: 0a                                               .