/ Hex Artifact Content
Login

Artifact 7aff2b795c4a001716c40fff7e3928750e2f6b8f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4a 61 6e 75 61  /*.** 2009 Janua
0010: 72 79 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ry 28.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u 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 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  e contains the i
0190: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
01a0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 61 63   the sqlite3_bac
01b0: 6b 75 70 5f 58 58 58 28 29 20 0a 2a 2a 20 41 50  kup_XXX() .** AP
01c0: 49 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  I functions and 
01d0: 74 68 65 20 72 65 6c 61 74 65 64 20 66 65 61 74  the related feat
01e0: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  ures..**.** $Id:
01f0: 20 62 61 63 6b 75 70 2e 63 2c 76 20 31 2e 39 20   backup.c,v 1.9 
0200: 32 30 30 39 2f 30 32 2f 30 39 20 31 38 3a 35 35  2009/02/09 18:55
0210: 3a 34 36 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :46 danielk1977 
0220: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0230: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0240: 23 69 6e 63 6c 75 64 65 20 22 62 74 72 65 65 49  #include "btreeI
0250: 6e 74 2e 68 22 0a 0a 2f 2a 20 4d 61 63 72 6f 20  nt.h"../* Macro 
0260: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69  to find the mini
0270: 6d 75 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72  mum of two numer
0280: 69 63 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69  ic values..*/.#i
0290: 66 6e 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69  fndef MIN.# defi
02a0: 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29  ne MIN(x,y) ((x)
02b0: 3c 28 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65  <(y)?(x):(y)).#e
02c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  ndif../*.** Stru
02d0: 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
02e0: 66 6f 72 20 65 61 63 68 20 62 61 63 6b 75 70 20  for each backup 
02f0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
0300: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 62 61 63  ruct sqlite3_bac
0310: 6b 75 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 2a  kup {.  sqlite3*
0320: 20 70 44 65 73 74 44 62 3b 20 20 20 20 20 20 20   pDestDb;       
0330: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
0340: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
0350: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 44 65 73  */.  Btree *pDes
0360: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
0370: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 62 2d 74   Destination b-t
0380: 72 65 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33  ree file */.  u3
0390: 32 20 69 44 65 73 74 53 63 68 65 6d 61 3b 20 20  2 iDestSchema;  
03a0: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
03b0: 61 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  al schema cookie
03c0: 20 69 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   in destination 
03d0: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 74 4c 6f  */.  int bDestLo
03e0: 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  cked;         /*
03f0: 20 54 72 75 65 20 6f 6e 63 65 20 61 20 77 72 69   True once a wri
0400: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
0410: 73 20 6f 70 65 6e 20 6f 6e 20 70 44 65 73 74 20  s open on pDest 
0420: 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 4e 65 78 74  */..  Pgno iNext
0430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0440: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
0450: 20 74 68 65 20 6e 65 78 74 20 73 6f 75 72 63 65   the next source
0460: 20 70 61 67 65 20 74 6f 20 63 6f 70 79 20 2a 2f   page to copy */
0470: 0a 20 20 73 71 6c 69 74 65 33 2a 20 70 53 72 63  .  sqlite3* pSrc
0480: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  Db;         /* S
0490: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 68  ource database h
04a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
04b0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
04c0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 62 2d      /* Source b-
04d0: 74 72 65 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  tree file */..  
04e0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
04f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 63 6b           /* Back
0500: 75 70 20 70 72 6f 63 65 73 73 20 65 72 72 6f 72  up process error
0510: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
0520: 68 65 73 65 20 74 77 6f 20 76 61 72 69 61 62 6c  hese two variabl
0530: 65 73 20 61 72 65 20 73 65 74 20 62 79 20 65 76  es are set by ev
0540: 65 72 79 20 63 61 6c 6c 20 74 6f 20 62 61 63 6b  ery call to back
0550: 75 70 5f 73 74 65 70 28 29 2e 20 54 68 65 79 20  up_step(). They 
0560: 61 72 65 0a 20 20 2a 2a 20 72 65 61 64 20 62 79  are.  ** read by
0570: 20 63 61 6c 6c 73 20 74 6f 20 62 61 63 6b 75 70   calls to backup
0580: 5f 72 65 6d 61 69 6e 69 6e 67 28 29 20 61 6e 64  _remaining() and
0590: 20 62 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e   backup_pagecoun
05a0: 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 50 67 6e 6f  t()..  */.  Pgno
05b0: 20 6e 52 65 6d 61 69 6e 69 6e 67 3b 20 20 20 20   nRemaining;    
05c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
05d0: 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
05e0: 63 6f 70 79 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  copy */.  Pgno n
05f0: 50 61 67 65 63 6f 75 6e 74 3b 20 20 20 20 20 20  Pagecount;      
0600: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
0610: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 63  er of pages to c
0620: 6f 70 79 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  opy */..  sqlite
0630: 33 5f 62 61 63 6b 75 70 20 2a 70 4e 65 78 74 3b  3_backup *pNext;
0640: 20 20 20 2f 2a 20 4e 65 78 74 20 62 61 63 6b 75     /* Next backu
0650: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
0660: 68 20 73 6f 75 72 63 65 20 70 61 67 65 72 20 2a  h source pager *
0670: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 48 52 45  /.};../*.** THRE
0680: 41 44 20 53 41 46 45 54 59 20 4e 4f 54 45 53 3a  AD SAFETY NOTES:
0690: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 63 65 20 69 74  .**.**   Once it
06a0: 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
06b0: 64 20 75 73 69 6e 67 20 62 61 63 6b 75 70 5f 69  d using backup_i
06c0: 6e 69 74 28 29 2c 20 61 20 73 69 6e 67 6c 65 20  nit(), a single 
06d0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 0a 2a  sqlite3_backup.*
06e0: 2a 20 20 20 73 74 72 75 63 74 75 72 65 20 6d 61  *   structure ma
06f0: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 76 69  y be accessed vi
0700: 61 20 74 77 6f 20 67 72 6f 75 70 73 20 6f 66 20  a two groups of 
0710: 74 68 72 65 61 64 2d 73 61 66 65 20 65 6e 74 72  thread-safe entr
0720: 79 20 70 6f 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  y points:.**.** 
0730: 20 20 20 20 2a 20 56 69 61 20 74 68 65 20 73 71      * Via the sq
0740: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 58 58 58  lite3_backup_XXX
0750: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  () API function 
0760: 62 61 63 6b 75 70 5f 73 74 65 70 28 29 20 61 6e  backup_step() an
0770: 64 20 0a 2a 2a 20 20 20 20 20 20 20 62 61 63 6b  d .**       back
0780: 75 70 5f 66 69 6e 69 73 68 28 29 2e 20 42 6f 74  up_finish(). Bot
0790: 68 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  h these function
07a0: 73 20 6f 62 74 61 69 6e 20 74 68 65 20 73 6f 75  s obtain the sou
07b0: 72 63 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  rce database.** 
07c0: 20 20 20 20 20 20 68 61 6e 64 6c 65 20 6d 75 74        handle mut
07d0: 65 78 20 61 6e 64 20 74 68 65 20 6d 75 74 65 78  ex and the mutex
07e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
07f0: 20 74 68 65 20 73 6f 75 72 63 65 20 42 74 53 68   the source BtSh
0800: 61 72 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 73  ared .**       s
0810: 74 72 75 63 74 75 72 65 2c 20 69 6e 20 74 68 61  tructure, in tha
0820: 74 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  t order..**.**  
0830: 20 20 20 2a 20 56 69 61 20 74 68 65 20 42 61 63     * Via the Bac
0840: 6b 75 70 55 70 64 61 74 65 28 29 20 61 6e 64 20  kupUpdate() and 
0850: 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20  BackupRestart() 
0860: 66 75 6e 63 74 69 6f 6e 73 2c 20 77 68 69 63 68  functions, which
0870: 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   are.**       in
0880: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 70 61 67  voked by the pag
0890: 65 72 20 6c 61 79 65 72 20 74 6f 20 72 65 70 6f  er layer to repo
08a0: 72 74 20 76 61 72 69 6f 75 73 20 73 74 61 74 65  rt various state
08b0: 20 63 68 61 6e 67 65 73 20 69 6e 0a 2a 2a 20 20   changes in.**  
08c0: 20 20 20 20 20 74 68 65 20 70 61 67 65 20 63 61       the page ca
08d0: 63 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  che associated w
08e0: 69 74 68 20 74 68 65 20 73 6f 75 72 63 65 20 64  ith the source d
08f0: 61 74 61 62 61 73 65 2e 20 54 68 65 20 6d 75 74  atabase. The mut
0900: 65 78 0a 2a 2a 20 20 20 20 20 20 20 61 73 73 6f  ex.**       asso
0910: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
0920: 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
0930: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0940: 72 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 0a  re will always .
0950: 2a 2a 20 20 20 20 20 20 20 62 65 20 68 65 6c 64  **       be held
0960: 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20   when either of 
0970: 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
0980: 61 72 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 0a  are invoked..**.
0990: 2a 2a 20 20 20 54 68 65 20 6f 74 68 65 72 20 73  **   The other s
09a0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 58 58  qlite3_backup_XX
09b0: 58 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  X() API function
09c0: 73 2c 20 62 61 63 6b 75 70 5f 72 65 6d 61 69 6e  s, backup_remain
09d0: 69 6e 67 28 29 20 61 6e 64 0a 2a 2a 20 20 20 62  ing() and.**   b
09e0: 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28  ackup_pagecount(
09f0: 29 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  ) are not thread
0a00: 2d 73 61 66 65 20 66 75 6e 63 74 69 6f 6e 73 2e  -safe functions.
0a10: 20 49 66 20 74 68 65 79 20 61 72 65 20 63 61 6c   If they are cal
0a20: 6c 65 64 0a 2a 2a 20 20 20 77 68 69 6c 65 20 73  led.**   while s
0a30: 6f 6d 65 20 6f 74 68 65 72 20 74 68 72 65 61 64  ome other thread
0a40: 20 69 73 20 63 61 6c 6c 69 6e 67 20 62 61 63 6b   is calling back
0a50: 75 70 5f 73 74 65 70 28 29 20 6f 72 20 62 61 63  up_step() or bac
0a60: 6b 75 70 5f 66 69 6e 69 73 68 28 29 2c 0a 2a 2a  kup_finish(),.**
0a70: 20 20 20 74 68 65 20 76 61 6c 75 65 73 20 72 65     the values re
0a80: 74 75 72 6e 65 64 20 6d 61 79 20 62 65 20 69 6e  turned may be in
0a90: 76 61 6c 69 64 2e 20 54 68 65 72 65 20 69 73 20  valid. There is 
0aa0: 6e 6f 20 77 61 79 20 66 6f 72 20 61 20 63 61 6c  no way for a cal
0ab0: 6c 20 74 6f 0a 2a 2a 20 20 20 42 61 63 6b 75 70  l to.**   Backup
0ac0: 55 70 64 61 74 65 28 29 20 6f 72 20 42 61 63 6b  Update() or Back
0ad0: 75 70 52 65 73 74 61 72 74 28 29 20 74 6f 20 69  upRestart() to i
0ae0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 62 61  nterfere with ba
0af0: 63 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 29  ckup_remaining()
0b00: 0a 2a 2a 20 20 20 6f 72 20 62 61 63 6b 75 70 5f  .**   or backup_
0b10: 70 61 67 65 63 6f 75 6e 74 28 29 2e 0a 2a 2a 0a  pagecount()..**.
0b20: 2a 2a 20 20 20 44 65 70 65 6e 64 69 6e 67 20 6f  **   Depending o
0b30: 6e 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6e  n the SQLite con
0b40: 66 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20  figuration, the 
0b50: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
0b60: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 20 20 74 68 65   and/or.**   the
0b70: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 6d   Btree objects m
0b80: 61 79 20 68 61 76 65 20 74 68 65 69 72 20 6f 77  ay have their ow
0b90: 6e 20 6d 75 74 65 78 65 73 20 74 68 61 74 20 72  n mutexes that r
0ba0: 65 71 75 69 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a  equire locking..
0bb0: 2a 2a 20 20 20 4e 6f 6e 2d 73 68 61 72 61 62 6c  **   Non-sharabl
0bc0: 65 20 42 74 72 65 65 73 20 28 69 6e 2d 6d 65 6d  e Btrees (in-mem
0bd0: 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 66 6f  ory databases fo
0be0: 72 20 65 78 61 6d 70 6c 65 29 2c 20 64 6f 20 6e  r example), do n
0bf0: 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 61 73 73  ot have.**   ass
0c00: 6f 63 69 61 74 65 64 20 6d 75 74 65 78 65 73 2e  ociated mutexes.
0c10: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
0c20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 63 6f 72 72  n a pointer corr
0c30: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74  esponding to dat
0c40: 61 62 61 73 65 20 7a 44 62 20 28 69 2e 65 2e 20  abase zDb (i.e. 
0c50: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
0c60: 2a 2a 20 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** in connection
0c70: 20 68 61 6e 64 6c 65 20 70 44 62 2e 20 49 66 20   handle pDb. If 
0c80: 73 75 63 68 20 61 20 64 61 74 61 62 61 73 65 20  such a database 
0c90: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
0ca0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 4e 55 4c   return.** a NUL
0cb0: 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 77 72  L pointer and wr
0cc0: 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
0cd0: 73 61 67 65 20 74 6f 20 70 45 72 72 6f 72 44 62  sage to pErrorDb
0ce0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
0cf0: 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 20 69  temp" database i
0d00: 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
0d10: 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 6f  may need to be o
0d20: 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 0a 2a  pened by this .*
0d30: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61  * function. If a
0d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
0d50: 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 72  hile doing so, r
0d60: 65 74 75 72 6e 20 30 20 61 6e 64 20 77 72 69 74  eturn 0 and writ
0d70: 65 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 6d  e an .** error m
0d80: 65 73 73 61 67 65 20 74 6f 20 70 45 72 72 6f 72  essage to pError
0d90: 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 74  Db..*/.static Bt
0da0: 72 65 65 20 2a 66 69 6e 64 42 74 72 65 65 28 73  ree *findBtree(s
0db0: 71 6c 69 74 65 33 20 2a 70 45 72 72 6f 72 44 62  qlite3 *pErrorDb
0dc0: 2c 20 73 71 6c 69 74 65 33 20 2a 70 44 62 2c 20  , sqlite3 *pDb, 
0dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
0de0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69  {.  int i = sqli
0df0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70 44  te3FindDbName(pD
0e00: 62 2c 20 7a 44 62 29 3b 0a 0a 20 20 69 66 28 20  b, zDb);..  if( 
0e10: 69 3d 3d 31 20 29 7b 0a 20 20 20 20 50 61 72 73  i==1 ){.    Pars
0e20: 65 20 73 50 61 72 73 65 3b 0a 20 20 20 20 6d 65  e sParse;.    me
0e30: 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c  mset(&sParse, 0,
0e40: 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29   sizeof(sParse))
0e50: 3b 0a 20 20 20 20 73 50 61 72 73 65 2e 64 62 20  ;.    sParse.db 
0e60: 3d 20 70 44 62 3b 0a 20 20 20 20 69 66 28 20 73  = pDb;.    if( s
0e70: 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
0e80: 74 61 62 61 73 65 28 26 73 50 61 72 73 65 29 20  tabase(&sParse) 
0e90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
0ea0: 45 72 72 6f 72 43 6c 65 61 72 28 26 73 50 61 72  ErrorClear(&sPar
0eb0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
0ec0: 65 33 45 72 72 6f 72 28 70 45 72 72 6f 72 44 62  e3Error(pErrorDb
0ed0: 2c 20 73 50 61 72 73 65 2e 72 63 2c 20 22 25 73  , sParse.rc, "%s
0ee0: 22 2c 20 73 50 61 72 73 65 2e 7a 45 72 72 4d 73  ", sParse.zErrMs
0ef0: 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
0f00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   0;.    }.    as
0f10: 73 65 72 74 28 20 73 50 61 72 73 65 2e 7a 45 72  sert( sParse.zEr
0f20: 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rMsg==0 );.  }..
0f30: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
0f40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 45   sqlite3Error(pE
0f50: 72 72 6f 72 44 62 2c 20 53 51 4c 49 54 45 5f 45  rrorDb, SQLITE_E
0f60: 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  RROR, "unknown d
0f70: 61 74 61 62 61 73 65 20 25 73 22 2c 20 7a 44 62  atabase %s", zDb
0f80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
0f90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
0fa0: 44 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  Db->aDb[i].pBt;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
0fc0: 61 6e 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  an sqlite3_backu
0fd0: 70 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 70  p process to cop
0fe0: 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
0ff0: 66 20 7a 53 72 63 44 62 20 66 72 6f 6d 0a 2a 2a  f zSrcDb from.**
1000: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
1010: 6c 65 20 70 53 72 63 44 62 20 74 6f 20 7a 44 65  le pSrcDb to zDe
1020: 73 74 44 62 20 69 6e 20 70 44 65 73 74 44 62 2e  stDb in pDestDb.
1030: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1040: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
1050: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1060: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
1070: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ject..**.** If a
1080: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1090: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
10a0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
10b0: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
10c0: 73 61 67 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  sage.** stored i
10d0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
10e0: 65 20 70 44 65 73 74 44 62 2e 0a 2a 2f 0a 73 71  e pDestDb..*/.sq
10f0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 73 71  lite3_backup *sq
1100: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
1110: 74 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 70 44  t(.  sqlite3* pD
1120: 65 73 74 44 62 2c 20 20 20 20 20 20 20 20 20 20  estDb,          
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1140: 74 61 62 61 73 65 20 74 6f 20 77 72 69 74 65 20  tabase to write 
1150: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
1160: 61 72 20 2a 7a 44 65 73 74 44 62 2c 20 20 20 20  ar *zDestDb,    
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1180: 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
1190: 65 20 77 69 74 68 69 6e 20 70 44 65 73 74 44 62  e within pDestDb
11a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 2a 20 70   */.  sqlite3* p
11b0: 53 72 63 44 62 2c 20 20 20 20 20 20 20 20 20 20  SrcDb,          
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11e0: 6f 6e 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  on to read from 
11f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1200: 2a 7a 53 72 63 44 62 20 20 20 20 20 20 20 20 20  *zSrcDb         
1210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1220: 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 77  me of database w
1230: 69 74 68 69 6e 20 70 53 72 63 44 62 20 2a 2f 0a  ithin pSrcDb */.
1240: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  ){.  sqlite3_bac
1250: 6b 75 70 20 2a 70 3b 20 20 20 20 20 20 20 20 20  kup *p;         
1260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1270: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
1280: 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
1290: 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
12a0: 68 61 6e 64 6c 65 2e 20 54 68 65 20 64 65 73 74  handle. The dest
12b0: 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65  ination database
12c0: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73 20  .  ** handle is 
12d0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 69 6e 20 74 68  not locked in th
12e0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 62 75 74 20  is routine, but 
12f0: 69 74 20 69 73 20 6c 6f 63 6b 65 64 20 69 6e 0a  it is locked in.
1300: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 62 61 63    ** sqlite3_bac
1310: 6b 75 70 5f 73 74 65 70 28 29 2e 20 54 68 65 20  kup_step(). The 
1320: 75 73 65 72 20 69 73 20 72 65 71 75 69 72 65 64  user is required
1330: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1340: 6e 6f 0a 20 20 2a 2a 20 6f 74 68 65 72 20 74 68  no.  ** other th
1350: 72 65 61 64 20 61 63 63 65 73 73 65 73 20 74 68  read accesses th
1360: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 68 61  e destination ha
1370: 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 75 72  ndle for the dur
1380: 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 74 68  ation.  ** of th
1390: 65 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69  e backup operati
13a0: 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
13b0: 20 74 6f 20 75 73 65 20 74 68 65 20 64 65 73 74   to use the dest
13c0: 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 61 74  ination.  ** dat
13d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13e0: 20 77 68 69 6c 65 20 61 20 62 61 63 6b 75 70 20   while a backup 
13f0: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6d  is in progress m
1400: 61 79 20 63 61 75 73 65 0a 20 20 2a 2a 20 61 20  ay cause.  ** a 
1410: 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 6f 72 20 61  malfunction or a
1420: 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
1430: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1440: 65 6e 74 65 72 28 70 53 72 63 44 62 2d 3e 6d 75  enter(pSrcDb->mu
1450: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tex);.  sqlite3_
1460: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 44 65 73  mutex_enter(pDes
1470: 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  tDb->mutex);..  
1480: 69 66 28 20 70 53 72 63 44 62 3d 3d 70 44 65 73  if( pSrcDb==pDes
1490: 74 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tDb ){.    sqlit
14a0: 65 33 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20  e3Error(.       
14b0: 20 70 44 65 73 74 44 62 2c 20 53 51 4c 49 54 45   pDestDb, SQLITE
14c0: 5f 45 52 52 4f 52 2c 20 22 73 6f 75 72 63 65 20  _ERROR, "source 
14d0: 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  and destination 
14e0: 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74  must be distinct
14f0: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 20 3d  ".    );.    p =
1500: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 7b 0a 20 20   0;.  }else {.  
1510: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1520: 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 73 71  ace for a new sq
1530: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
1540: 65 63 74 20 2a 2f 0a 20 20 20 20 70 20 3d 20 28  ect */.    p = (
1550: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
1560: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1570: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 62  sizeof(sqlite3_b
1580: 61 63 6b 75 70 29 29 3b 0a 20 20 20 20 69 66 28  ackup));.    if(
1590: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   !p ){.      sql
15a0: 69 74 65 33 45 72 72 6f 72 28 70 44 65 73 74 44  ite3Error(pDestD
15b0: 62 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  b, SQLITE_NOMEM,
15c0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
15d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f    /* If the allo
15e0: 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64  cation succeeded
15f0: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  , populate the n
1600: 65 77 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ew object. */.  
1610: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d  if( p ){.    mem
1620: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1630: 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 29  (sqlite3_backup)
1640: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  );.    p->pSrc =
1650: 20 66 69 6e 64 42 74 72 65 65 28 70 44 65 73 74   findBtree(pDest
1660: 44 62 2c 20 70 53 72 63 44 62 2c 20 7a 53 72 63  Db, pSrcDb, zSrc
1670: 44 62 29 3b 0a 20 20 20 20 70 2d 3e 70 44 65 73  Db);.    p->pDes
1680: 74 20 3d 20 66 69 6e 64 42 74 72 65 65 28 70 44  t = findBtree(pD
1690: 65 73 74 44 62 2c 20 70 44 65 73 74 44 62 2c 20  estDb, pDestDb, 
16a0: 7a 44 65 73 74 44 62 29 3b 0a 20 20 20 20 70 2d  zDestDb);.    p-
16b0: 3e 70 44 65 73 74 44 62 20 3d 20 70 44 65 73 74  >pDestDb = pDest
16c0: 44 62 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 44  Db;.    p->pSrcD
16d0: 62 20 3d 20 70 53 72 63 44 62 3b 0a 20 20 20 20  b = pSrcDb;.    
16e0: 70 2d 3e 69 4e 65 78 74 20 3d 20 31 3b 0a 0a 20  p->iNext = 1;.. 
16f0: 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 70 53 72     if( 0==p->pSr
1700: 63 20 7c 7c 20 30 3d 3d 70 2d 3e 70 44 65 73 74  c || 0==p->pDest
1710: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1720: 20 28 6f 72 20 62 6f 74 68 29 20 6f 66 20 74 68   (or both) of th
1730: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
1740: 73 20 64 69 64 20 6e 6f 74 20 65 78 69 73 74 2e  s did not exist.
1750: 20 41 6e 20 65 72 72 6f 72 20 68 61 73 0a 20 20   An error has.  
1760: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
1770: 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  een written into
1780: 20 74 68 65 20 70 44 65 73 74 44 62 20 68 61 6e   the pDestDb han
1790: 64 6c 65 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  dle. All that is
17a0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2a 20 74   left.      ** t
17b0: 6f 20 64 6f 20 68 65 72 65 20 69 73 20 66 72 65  o do here is fre
17c0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 61  e the sqlite3_ba
17d0: 63 6b 75 70 20 73 74 72 75 63 74 75 72 65 2e 0a  ckup structure..
17e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
17f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1800: 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20        p = 0;.   
1810: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1820: 65 76 65 72 79 74 68 69 6e 67 20 68 61 73 20 67  everything has g
1830: 6f 6e 65 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  one as planned, 
1840: 61 74 74 61 63 68 20 74 68 65 20 62 61 63 6b 75  attach the backu
1850: 70 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 0a  p object to the.
1860: 20 20 2a 2a 20 73 6f 75 72 63 65 20 70 61 67 65    ** source page
1870: 72 2e 20 54 68 65 20 73 6f 75 72 63 65 20 70 61  r. The source pa
1880: 67 65 72 20 63 61 6c 6c 73 20 42 61 63 6b 75 70  ger calls Backup
1890: 55 70 64 61 74 65 28 29 20 61 6e 64 20 42 61 63  Update() and Bac
18a0: 6b 75 70 52 65 73 74 61 72 74 28 29 0a 20 20 2a  kupRestart().  *
18b0: 2a 20 74 6f 20 6e 6f 74 69 66 79 20 74 68 69 73  * to notify this
18c0: 20 6d 6f 64 75 6c 65 20 69 66 20 74 68 65 20 73   module if the s
18d0: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6d 6f  ource file is mo
18e0: 64 69 66 69 65 64 20 6d 69 64 2d 62 61 63 6b 75  dified mid-backu
18f0: 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 20  p..  */.  if( p 
1900: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
1910: 61 63 6b 75 70 20 2a 2a 70 70 3b 20 20 20 20 20  ackup **pp;     
1920: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1930: 65 72 20 74 6f 20 68 65 61 64 20 6f 66 20 70 61  er to head of pa
1940: 67 65 72 73 20 62 61 63 6b 75 70 20 6c 69 73 74  gers backup list
1950: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1960: 74 72 65 65 45 6e 74 65 72 28 70 2d 3e 70 53 72  treeEnter(p->pSr
1970: 63 29 3b 0a 20 20 20 20 70 70 20 3d 20 73 71 6c  c);.    pp = sql
1980: 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50  ite3PagerBackupP
1990: 74 72 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  tr(sqlite3BtreeP
19a0: 61 67 65 72 28 70 2d 3e 70 53 72 63 29 29 3b 0a  ager(p->pSrc));.
19b0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 2a      p->pNext = *
19c0: 70 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b  pp;.    *pp = p;
19d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19e0: 65 4c 65 61 76 65 28 70 2d 3e 70 53 72 63 29 3b  eLeave(p->pSrc);
19f0: 0a 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 6e 42  .    p->pSrc->nB
1a00: 61 63 6b 75 70 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ackup++;.  }..  
1a10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a20: 61 76 65 28 70 44 65 73 74 44 62 2d 3e 6d 75 74  ave(pDestDb->mut
1a30: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ex);.  sqlite3_m
1a40: 75 74 65 78 5f 6c 65 61 76 65 28 70 53 72 63 44  utex_leave(pSrcD
1a50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1a60: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1a70: 41 72 67 75 6d 65 6e 74 20 72 63 20 69 73 20 61  Argument rc is a
1a80: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1a90: 6f 64 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ode. Return true
1aa0: 20 69 66 20 74 68 69 73 20 65 72 72 6f 72 20 69   if this error i
1ab0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
1ac0: 20 66 61 74 61 6c 20 69 66 20 65 6e 63 6f 75 6e   fatal if encoun
1ad0: 74 65 72 65 64 20 64 75 72 69 6e 67 20 61 20 62  tered during a b
1ae0: 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e  ackup operation.
1af0: 20 41 6c 6c 20 65 72 72 6f 72 73 0a 2a 2a 20 61   All errors.** a
1b00: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 66 61  re considered fa
1b10: 74 61 6c 20 65 78 63 65 70 74 20 66 6f 72 20 53  tal except for S
1b20: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 53  QLITE_BUSY and S
1b30: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f  QLITE_LOCKED..*/
1b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 46 61  .static int isFa
1b50: 74 61 6c 45 72 72 6f 72 28 69 6e 74 20 72 63 29  talError(int rc)
1b60: 7b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 21 3d  {.  return (rc!=
1b70: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1b80: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1b90: 72 63 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc!=SQLITE_LOCKE
1ba0: 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  D);.}../*.** Par
1bb0: 61 6d 65 74 65 72 20 7a 53 72 63 44 61 74 61 20  ameter zSrcData 
1bc0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1bd0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1be0: 65 20 64 61 74 61 20 66 6f 72 20 0a 2a 2a 20 70  e data for .** p
1bf0: 61 67 65 20 69 53 72 63 50 67 20 66 72 6f 6d 20  age iSrcPg from 
1c00: 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  the source datab
1c10: 61 73 65 2e 20 43 6f 70 79 20 74 68 69 73 20 64  ase. Copy this d
1c20: 61 74 61 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ata into the .**
1c30: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74   destination dat
1c40: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1c50: 20 69 6e 74 20 62 61 63 6b 75 70 4f 6e 65 50 61   int backupOnePa
1c60: 67 65 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ge(sqlite3_backu
1c70: 70 20 2a 70 2c 20 50 67 6e 6f 20 69 53 72 63 50  p *p, Pgno iSrcP
1c80: 67 2c 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 72  g, const u8 *zSr
1c90: 63 44 61 74 61 29 7b 0a 20 20 50 61 67 65 72 20  cData){.  Pager 
1ca0: 2a 20 63 6f 6e 73 74 20 70 44 65 73 74 50 61 67  * const pDestPag
1cb0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
1cc0: 65 50 61 67 65 72 28 70 2d 3e 70 44 65 73 74 29  ePager(p->pDest)
1cd0: 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53  ;.  const int nS
1ce0: 72 63 50 67 73 7a 20 3d 20 73 71 6c 69 74 65 33  rcPgsz = sqlite3
1cf0: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
1d00: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 69 6e 74  (p->pSrc);.  int
1d10: 20 6e 44 65 73 74 50 67 73 7a 20 3d 20 73 71 6c   nDestPgsz = sql
1d20: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1d30: 53 69 7a 65 28 70 2d 3e 70 44 65 73 74 29 3b 0a  Size(p->pDest);.
1d40: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 6f 70    const int nCop
1d50: 79 20 3d 20 4d 49 4e 28 6e 53 72 63 50 67 73 7a  y = MIN(nSrcPgsz
1d60: 2c 20 6e 44 65 73 74 50 67 73 7a 29 3b 0a 20 20  , nDestPgsz);.  
1d70: 63 6f 6e 73 74 20 69 36 34 20 69 45 6e 64 20 3d  const i64 iEnd =
1d80: 20 28 69 36 34 29 69 53 72 63 50 67 2a 28 69 36   (i64)iSrcPg*(i6
1d90: 34 29 6e 53 72 63 50 67 73 7a 3b 0a 0a 20 20 69  4)nSrcPgsz;..  i
1da0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1db0: 4b 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a  K;.  i64 iOff;..
1dc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 44 65    assert( p->bDe
1dd0: 73 74 4c 6f 63 6b 65 64 20 29 3b 0a 20 20 61 73  stLocked );.  as
1de0: 73 65 72 74 28 20 21 69 73 46 61 74 61 6c 45 72  sert( !isFatalEr
1df0: 72 6f 72 28 70 2d 3e 72 63 29 20 29 3b 0a 20 20  ror(p->rc) );.  
1e00: 61 73 73 65 72 74 28 20 69 53 72 63 50 67 21 3d  assert( iSrcPg!=
1e10: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e20: 45 28 70 2d 3e 70 53 72 63 2d 3e 70 42 74 29 20  E(p->pSrc->pBt) 
1e30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 72  );.  assert( zSr
1e40: 63 44 61 74 61 20 29 3b 0a 0a 20 20 2f 2a 20 43  cData );..  /* C
1e50: 61 74 63 68 20 74 68 65 20 63 61 73 65 20 77 68  atch the case wh
1e60: 65 72 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ere the destinat
1e70: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ion is an in-mem
1e80: 6f 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ory database and
1e90: 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 73   the.  ** page s
1ea0: 69 7a 65 73 20 6f 66 20 74 68 65 20 73 6f 75 72  izes of the sour
1eb0: 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
1ec0: 6f 6e 20 64 69 66 66 65 72 2e 20 0a 20 20 2a 2f  on differ. .  */
1ed0: 0a 20 20 69 66 28 20 6e 53 72 63 50 67 73 7a 21  .  if( nSrcPgsz!
1ee0: 3d 6e 44 65 73 74 50 67 73 7a 20 26 26 20 73 71  =nDestPgsz && sq
1ef0: 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
1f00: 62 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  b(sqlite3BtreePa
1f10: 67 65 72 28 70 2d 3e 70 44 65 73 74 29 29 20 29  ger(p->pDest)) )
1f20: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1f30: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
1f40: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
1f50: 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1f60: 63 68 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 70  ch destination p
1f70: 61 67 65 20 73 70 61 6e 6e 65 64 20 62 79 20 74  age spanned by t
1f80: 68 65 20 73 6f 75 72 63 65 20 0a 20 20 2a 2a 20  he source .  ** 
1f90: 70 61 67 65 2e 20 46 6f 72 20 65 61 63 68 20 69  page. For each i
1fa0: 74 65 72 61 74 69 6f 6e 2c 20 76 61 72 69 61 62  teration, variab
1fb0: 6c 65 20 69 4f 66 66 20 69 73 20 73 65 74 20 74  le iOff is set t
1fc0: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
1fd0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65  t.  ** of the de
1fe0: 73 74 69 6e 61 74 69 6f 6e 20 70 61 67 65 2e 0a  stination page..
1ff0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 4f 66 66 3d    */.  for(iOff=
2000: 69 45 6e 64 2d 28 69 36 34 29 6e 53 72 63 50 67  iEnd-(i64)nSrcPg
2010: 73 7a 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  sz; rc==SQLITE_O
2020: 4b 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 3b 20  K && iOff<iEnd; 
2030: 69 4f 66 66 2b 3d 6e 44 65 73 74 50 67 73 7a 29  iOff+=nDestPgsz)
2040: 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
2050: 65 73 74 50 67 20 3d 20 30 3b 0a 20 20 20 20 50  estPg = 0;.    P
2060: 67 6e 6f 20 69 44 65 73 74 20 3d 20 28 50 67 6e  gno iDest = (Pgn
2070: 6f 29 28 69 4f 66 66 2f 6e 44 65 73 74 50 67 73  o)(iOff/nDestPgs
2080: 7a 29 2b 31 3b 0a 20 20 20 20 69 66 28 20 69 44  z)+1;.    if( iD
2090: 65 73 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  est==PENDING_BYT
20a0: 45 5f 50 41 47 45 28 70 2d 3e 70 44 65 73 74 2d  E_PAGE(p->pDest-
20b0: 3e 70 42 74 29 20 29 20 63 6f 6e 74 69 6e 75 65  >pBt) ) continue
20c0: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
20d0: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
20e0: 65 33 50 61 67 65 72 47 65 74 28 70 44 65 73 74  e3PagerGet(pDest
20f0: 50 61 67 65 72 2c 20 69 44 65 73 74 2c 20 26 70  Pager, iDest, &p
2100: 44 65 73 74 50 67 29 29 0a 20 20 20 20 20 26 26  DestPg)).     &&
2110: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
2120: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2130: 69 74 65 28 70 44 65 73 74 50 67 29 29 0a 20 20  ite(pDestPg)).  
2140: 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74    ){.      const
2150: 20 75 38 20 2a 7a 49 6e 20 3d 20 26 7a 53 72 63   u8 *zIn = &zSrc
2160: 44 61 74 61 5b 69 4f 66 66 25 6e 53 72 63 50 67  Data[iOff%nSrcPg
2170: 73 7a 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  sz];.      u8 *z
2180: 44 65 73 74 44 61 74 61 20 3d 20 73 71 6c 69 74  DestData = sqlit
2190: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
21a0: 44 65 73 74 50 67 29 3b 0a 20 20 20 20 20 20 75  DestPg);.      u
21b0: 38 20 2a 7a 4f 75 74 20 3d 20 26 7a 44 65 73 74  8 *zOut = &zDest
21c0: 44 61 74 61 5b 69 4f 66 66 25 6e 44 65 73 74 50  Data[iOff%nDestP
21d0: 67 73 7a 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  gsz];..      /* 
21e0: 43 6f 70 79 20 74 68 65 20 64 61 74 61 20 66 72  Copy the data fr
21f0: 6f 6d 20 74 68 65 20 73 6f 75 72 63 65 20 70 61  om the source pa
2200: 67 65 20 69 6e 74 6f 20 74 68 65 20 64 65 73 74  ge into the dest
2210: 69 6e 61 74 69 6f 6e 20 70 61 67 65 2e 0a 20 20  ination page..  
2220: 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6c 65 61      ** Then clea
2230: 72 20 74 68 65 20 42 74 72 65 65 20 6c 61 79 65  r the Btree laye
2240: 72 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74  r MemPage.isInit
2250: 20 66 6c 61 67 2e 20 42 6f 74 68 20 74 68 69 73   flag. Both this
2260: 20 6d 6f 64 75 6c 65 0a 20 20 20 20 20 20 2a 2a   module.      **
2270: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 63   and the pager c
2280: 6f 64 65 20 75 73 65 20 74 68 69 73 20 74 72 69  ode use this tri
2290: 63 6b 20 28 63 6c 65 61 72 69 6e 67 20 74 68 65  ck (clearing the
22a0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
22b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
22c0: 20 27 65 78 74 72 61 27 20 73 70 61 63 65 20 74   'extra' space t
22d0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
22e0: 20 42 74 72 65 65 20 6c 61 79 65 72 73 0a 20 20   Btree layers.  
22f0: 20 20 20 20 2a 2a 20 63 61 63 68 65 64 20 70 61      ** cached pa
2300: 72 73 65 20 6f 66 20 74 68 65 20 70 61 67 65 29  rse of the page)
2310: 2e 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74  . MemPage.isInit
2320: 20 69 73 20 6d 61 72 6b 65 64 20 0a 20 20 20 20   is marked .    
2330: 20 20 2a 2a 20 22 4d 55 53 54 20 42 45 20 46 49    ** "MUST BE FI
2340: 52 53 54 22 20 66 6f 72 20 74 68 69 73 20 70 75  RST" for this pu
2350: 72 70 6f 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  rpose..      */.
2360: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75        memcpy(zOu
2370: 74 2c 20 7a 49 6e 2c 20 6e 43 6f 70 79 29 3b 0a  t, zIn, nCopy);.
2380: 20 20 20 20 20 20 28 28 75 38 20 2a 29 73 71 6c        ((u8 *)sql
2390: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
23a0: 61 28 70 44 65 73 74 50 67 29 29 5b 30 5d 20 3d  a(pDestPg))[0] =
23b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
23c0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
23d0: 70 44 65 73 74 50 67 29 3b 0a 20 20 7d 0a 0a 20  pDestPg);.  }.. 
23e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23f0: 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 69 73  *.** If pFile is
2400: 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
2410: 72 20 74 68 61 6e 20 69 53 69 7a 65 20 62 79 74  r than iSize byt
2420: 65 73 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  es, then truncat
2430: 65 20 69 74 20 74 6f 0a 2a 2a 20 65 78 61 63 74  e it to.** exact
2440: 6c 79 20 69 53 69 7a 65 20 62 79 74 65 73 2e 20  ly iSize bytes. 
2450: 49 66 20 70 46 69 6c 65 20 69 73 20 6e 6f 74 20  If pFile is not 
2460: 6c 61 72 67 65 72 20 74 68 61 6e 20 69 53 69 7a  larger than iSiz
2470: 65 20 62 79 74 65 73 2c 20 74 68 65 6e 0a 2a 2a  e bytes, then.**
2480: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2490: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
24a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24b0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
24c0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  is successful, o
24d0: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
24e0: 72 20 0a 2a 2a 20 63 6f 64 65 20 69 66 20 61 6e  r .** code if an
24f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
2500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63  /.static int bac
2510: 6b 75 70 54 72 75 6e 63 61 74 65 46 69 6c 65 28  kupTruncateFile(
2520: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2530: 69 6c 65 2c 20 69 36 34 20 69 53 69 7a 65 29 7b  ile, i64 iSize){
2540: 0a 20 20 69 36 34 20 69 43 75 72 72 65 6e 74 3b  .  i64 iCurrent;
2550: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2560: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 46  te3OsFileSize(pF
2570: 69 6c 65 2c 20 26 69 43 75 72 72 65 6e 74 29 3b  ile, &iCurrent);
2580: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2590: 45 5f 4f 4b 20 26 26 20 69 43 75 72 72 65 6e 74  E_OK && iCurrent
25a0: 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63  >iSize ){.    rc
25b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
25c0: 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a  cate(pFile, iSiz
25d0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
25e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
25f0: 70 79 20 6e 50 61 67 65 20 70 61 67 65 73 20 66  py nPage pages f
2600: 72 6f 6d 20 74 68 65 20 73 6f 75 72 63 65 20 62  rom the source b
2610: 2d 74 72 65 65 20 74 6f 20 74 68 65 20 64 65 73  -tree to the des
2620: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  tination..*/.int
2630: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2640: 73 74 65 70 28 73 71 6c 69 74 65 33 5f 62 61 63  step(sqlite3_bac
2650: 6b 75 70 20 2a 70 2c 20 69 6e 74 20 6e 50 61 67  kup *p, int nPag
2660: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
2670: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2680: 6e 74 65 72 28 70 2d 3e 70 53 72 63 44 62 2d 3e  nter(p->pSrcDb->
2690: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
26a0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 2d 3e 70  3BtreeEnter(p->p
26b0: 53 72 63 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Src);.  if( p->p
26c0: 44 65 73 74 44 62 20 29 7b 0a 20 20 20 20 73 71  DestDb ){.    sq
26d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
26e0: 72 28 70 2d 3e 70 44 65 73 74 44 62 2d 3e 6d 75  r(p->pDestDb->mu
26f0: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  tex);.  }..  rc 
2700: 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 21  = p->rc;.  if( !
2710: 69 73 46 61 74 61 6c 45 72 72 6f 72 28 72 63 29  isFatalError(rc)
2720: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 20   ){.    Pager * 
2730: 63 6f 6e 73 74 20 70 53 72 63 50 61 67 65 72 20  const pSrcPager 
2740: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
2750: 67 65 72 28 70 2d 3e 70 53 72 63 29 3b 20 20 20  ger(p->pSrc);   
2760: 20 20 2f 2a 20 53 6f 75 72 63 65 20 70 61 67 65    /* Source page
2770: 72 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20 2a  r */.    Pager *
2780: 20 63 6f 6e 73 74 20 70 44 65 73 74 50 61 67 65   const pDestPage
2790: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
27a0: 50 61 67 65 72 28 70 2d 3e 70 44 65 73 74 29 3b  Pager(p->pDest);
27b0: 20 20 20 2f 2a 20 44 65 73 74 20 70 61 67 65 72     /* Dest pager
27c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
27f0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2800: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 50  */.    int nSrcP
2810: 61 67 65 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  age = -1;       
2820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2830: 65 20 6f 66 20 73 6f 75 72 63 65 20 64 62 20 69  e of source db i
2840: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 69  n pages */.    i
2850: 6e 74 20 62 43 6c 6f 73 65 54 72 61 6e 73 20 3d  nt bCloseTrans =
2860: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 72 63    /* True if src
2880: 20 64 62 20 72 65 71 75 69 72 65 73 20 75 6e 6c   db requires unl
2890: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 2f  ocking */..    /
28a0: 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 20  * If the source 
28b0: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
28c0: 6c 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  ly in a write-tr
28d0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
28e0: 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
28f0: 4c 4f 43 4b 45 44 20 69 6d 6d 65 64 69 61 74 65  LOCKED immediate
2900: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2910: 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 26 26  f( p->pDestDb &&
2920: 20 70 2d 3e 70 53 72 63 2d 3e 70 42 74 2d 3e 69   p->pSrc->pBt->i
2930: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
2940: 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2950: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
2960: 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OCKED;.    }else
2970: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2980: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
2990: 20 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 64     /* Lock the d
29a0: 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62  estination datab
29b0: 61 73 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  ase, if it is no
29c0: 74 20 6c 6f 63 6b 65 64 20 61 6c 72 65 61 64 79  t locked already
29d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
29e0: 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 70 2d  ITE_OK==rc && p-
29f0: 3e 62 44 65 73 74 4c 6f 63 6b 65 64 3d 3d 30 0a  >bDestLocked==0.
2a00: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
2a10: 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
2a20: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
2a30: 70 2d 3e 70 44 65 73 74 2c 20 32 29 29 20 0a 20  p->pDest, 2)) . 
2a40: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 62     ){.      p->b
2a50: 44 65 73 74 4c 6f 63 6b 65 64 20 3d 20 31 3b 0a  DestLocked = 1;.
2a60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a70: 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2a80: 2d 3e 70 44 65 73 74 2c 20 31 2c 20 26 70 2d 3e  ->pDest, 1, &p->
2a90: 69 44 65 73 74 53 63 68 65 6d 61 29 3b 0a 20 20  iDestSchema);.  
2aa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2ab0: 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
2ac0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
2ad0: 20 6f 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64   on the source d
2ae0: 61 74 61 62 61 73 65 2c 20 6f 70 65 6e 0a 20 20  atabase, open.  
2af0: 20 20 2a 2a 20 6f 6e 65 20 6e 6f 77 2e 20 49 66    ** one now. If
2b00: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
2b10: 73 20 6f 70 65 6e 65 64 20 68 65 72 65 2c 20 74  s opened here, t
2b20: 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 63  hen it will be c
2b30: 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 62 65 66  losed.    ** bef
2b40: 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
2b50: 6e 20 65 78 69 74 73 2e 0a 20 20 20 20 2a 2f 0a  n exits..    */.
2b60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b70: 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
2b80: 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
2b90: 54 72 61 6e 73 28 70 2d 3e 70 53 72 63 29 20 29  Trans(p->pSrc) )
2ba0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2bb0: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
2bc0: 61 6e 73 28 70 2d 3e 70 53 72 63 2c 20 30 29 3b  ans(p->pSrc, 0);
2bd0: 0a 20 20 20 20 20 20 62 43 6c 6f 73 65 54 72 61  .      bCloseTra
2be0: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ns = 1;.    }.  
2bf0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  .    /* Now that
2c00: 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
2c10: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 6f 75  -lock on the sou
2c20: 72 63 65 20 64 61 74 61 62 61 73 65 2c 20 71 75  rce database, qu
2c30: 65 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ery the.    ** s
2c40: 6f 75 72 63 65 20 70 61 67 65 72 20 66 6f 72 20  ource pager for 
2c50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
2c60: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
2c70: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2c80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c90: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2ca0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2cb0: 63 6f 75 6e 74 28 70 53 72 63 50 61 67 65 72 2c  count(pSrcPager,
2cc0: 20 26 6e 53 72 63 50 61 67 65 29 3b 0a 20 20 20   &nSrcPage);.   
2cd0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
2ce0: 20 28 6e 50 61 67 65 3c 30 20 7c 7c 20 69 69 3c   (nPage<0 || ii<
2cf0: 6e 50 61 67 65 29 20 26 26 20 70 2d 3e 69 4e 65  nPage) && p->iNe
2d00: 78 74 3c 3d 28 50 67 6e 6f 29 6e 53 72 63 50 61  xt<=(Pgno)nSrcPa
2d10: 67 65 20 26 26 20 21 72 63 3b 20 69 69 2b 2b 29  ge && !rc; ii++)
2d20: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  {.      const Pg
2d30: 6e 6f 20 69 53 72 63 50 67 20 3d 20 70 2d 3e 69  no iSrcPg = p->i
2d40: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
2d50: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
2d60: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2d70: 20 20 20 20 20 69 66 28 20 69 53 72 63 50 67 21       if( iSrcPg!
2d80: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2d90: 47 45 28 70 2d 3e 70 53 72 63 2d 3e 70 42 74 29  GE(p->pSrc->pBt)
2da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61   ){.        DbPa
2db0: 67 65 20 2a 70 53 72 63 50 67 3b 20 20 20 20 20  ge *pSrcPg;     
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
2de0: 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f  e page object */
2df0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2e00: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 53  lite3PagerGet(pS
2e10: 72 63 50 61 67 65 72 2c 20 69 53 72 63 50 67 2c  rcPager, iSrcPg,
2e20: 20 26 70 53 72 63 50 67 29 3b 0a 20 20 20 20 20   &pSrcPg);.     
2e30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e50: 20 20 72 63 20 3d 20 62 61 63 6b 75 70 4f 6e 65    rc = backupOne
2e60: 50 61 67 65 28 70 2c 20 69 53 72 63 50 67 2c 20  Page(p, iSrcPg, 
2e70: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
2e80: 61 74 61 28 70 53 72 63 50 67 29 29 3b 0a 20 20  ata(pSrcPg));.  
2e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2ea0: 61 67 65 72 55 6e 72 65 66 28 70 53 72 63 50 67  agerUnref(pSrcPg
2eb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ec0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 69 4e     }.      p->iN
2ed0: 65 78 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ext++;.    }.   
2ee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ef0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  OK ){.      p->n
2f00: 50 61 67 65 63 6f 75 6e 74 20 3d 20 6e 53 72 63  Pagecount = nSrc
2f10: 50 61 67 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Page;.      p->n
2f20: 52 65 6d 61 69 6e 69 6e 67 20 3d 20 6e 53 72 63  Remaining = nSrc
2f30: 50 61 67 65 2b 31 2d 70 2d 3e 69 4e 65 78 74 3b  Page+1-p->iNext;
2f40: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4e  .      if( p->iN
2f50: 65 78 74 3e 28 50 67 6e 6f 29 6e 53 72 63 50 61  ext>(Pgno)nSrcPa
2f60: 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
2f70: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
2f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f90: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2fa0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2fb0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 72 63    const int nSrc
2fc0: 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c 69 74  Pagesize = sqlit
2fd0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
2fe0: 7a 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20  ze(p->pSrc);.   
2ff0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 44 65     const int nDe
3000: 73 74 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c  stPagesize = sql
3010: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
3020: 53 69 7a 65 28 70 2d 3e 70 44 65 73 74 29 3b 0a  Size(p->pDest);.
3030: 20 20 20 20 20 20 69 6e 74 20 6e 44 65 73 74 54        int nDestT
3040: 72 75 6e 63 61 74 65 3b 0a 20 20 0a 20 20 20 20  runcate;.  .    
3050: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
3060: 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 66  schema version f
3070: 69 65 6c 64 20 69 6e 20 74 68 65 20 64 65 73 74  ield in the dest
3080: 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65  ination database
3090: 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
30a0: 69 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  is to make sure 
30b0: 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 2d  that the schema-
30c0: 76 65 72 73 69 6f 6e 20 72 65 61 6c 6c 79 20 64  version really d
30d0: 6f 65 73 20 63 68 61 6e 67 65 20 69 6e 0a 20 20  oes change in.  
30e0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20      ** the case 
30f0: 77 68 65 72 65 20 74 68 65 20 73 6f 75 72 63 65  where the source
3100: 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e   and destination
3110: 20 64 61 74 61 62 61 73 65 73 20 68 61 76 65 20   databases have 
3120: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 61 6d  the.      ** sam
3130: 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
3140: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
3150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
3160: 61 74 65 4d 65 74 61 28 70 2d 3e 70 44 65 73 74  ateMeta(p->pDest
3170: 2c 20 31 2c 20 70 2d 3e 69 44 65 73 74 53 63 68  , 1, p->iDestSch
3180: 65 6d 61 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  ema+1);.      if
3190: 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29 7b 0a  ( p->pDestDb ){.
31a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
31b0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
31c0: 6d 61 28 70 2d 3e 70 44 65 73 74 44 62 2c 20 30  ma(p->pDestDb, 0
31d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31e0: 20 20 2f 2a 20 53 65 74 20 6e 44 65 73 74 54 72    /* Set nDestTr
31f0: 75 6e 63 61 74 65 20 74 6f 20 74 68 65 20 66 69  uncate to the fi
3200: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
3210: 67 65 73 20 69 6e 20 74 68 65 20 64 65 73 74 69  ges in the desti
3220: 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
3230: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63 6f  database. The co
3240: 6d 70 6c 69 63 61 74 69 6f 6e 20 68 65 72 65 20  mplication here 
3250: 69 73 20 74 68 61 74 20 74 68 65 20 64 65 73 74  is that the dest
3260: 69 6e 61 74 69 6f 6e 20 70 61 67 65 0a 20 20 20  ination page.   
3270: 20 20 20 2a 2a 20 73 69 7a 65 20 6d 61 79 20 62     ** size may b
3280: 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 74  e different to t
3290: 68 65 20 73 6f 75 72 63 65 20 70 61 67 65 20 73  he source page s
32a0: 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ize. .      **. 
32b0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 73       ** If the s
32c0: 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a 65 20  ource page size 
32d0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
32e0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
32f0: 70 61 67 65 20 73 69 7a 65 2c 20 0a 20 20 20 20  page size, .    
3300: 20 20 2a 2a 20 72 6f 75 6e 64 20 75 70 2e 20 49    ** round up. I
3310: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
3320: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
3330: 73 54 72 75 6e 63 61 74 65 28 29 20 62 65 6c 6f  sTruncate() belo
3340: 77 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  w will.      ** 
3350: 66 69 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20  fix the size of 
3360: 74 68 65 20 66 69 6c 65 2e 20 48 6f 77 65 76 65  the file. Howeve
3370: 72 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  r it is importan
3380: 74 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 20 20  t to call.      
3390: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ** sqlite3PagerT
33a0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 68  runcateImage() h
33b0: 65 72 65 20 73 6f 20 74 68 61 74 20 61 6e 79 20  ere so that any 
33c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 0a 20 20  pages in the .  
33d0: 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
33e0: 6f 6e 20 66 69 6c 65 20 74 68 61 74 20 6c 69 65  on file that lie
33f0: 20 62 65 79 6f 6e 64 20 74 68 65 20 6e 44 65 73   beyond the nDes
3400: 74 54 72 75 6e 63 61 74 65 20 70 61 67 65 20 6d  tTruncate page m
3410: 61 72 6b 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ark are.      **
3420: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 50   journalled by P
3430: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
3440: 6e 65 28 29 20 62 65 66 6f 72 65 20 74 68 65 79  ne() before they
3450: 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 0a 20   are destroyed. 
3460: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 66       ** by the f
3470: 69 6c 65 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a  ile truncation..
3480: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
3490: 66 28 20 6e 53 72 63 50 61 67 65 73 69 7a 65 3c  f( nSrcPagesize<
34a0: 6e 44 65 73 74 50 61 67 65 73 69 7a 65 20 29 7b  nDestPagesize ){
34b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 61 74  .        int rat
34c0: 69 6f 20 3d 20 6e 44 65 73 74 50 61 67 65 73 69  io = nDestPagesi
34d0: 7a 65 2f 6e 53 72 63 50 61 67 65 73 69 7a 65 3b  ze/nSrcPagesize;
34e0: 0a 20 20 20 20 20 20 20 20 6e 44 65 73 74 54 72  .        nDestTr
34f0: 75 6e 63 61 74 65 20 3d 20 28 6e 53 72 63 50 61  uncate = (nSrcPa
3500: 67 65 2b 72 61 74 69 6f 2d 31 29 2f 72 61 74 69  ge+ratio-1)/rati
3510: 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  o;.      }else{.
3520: 20 20 20 20 20 20 20 20 6e 44 65 73 74 54 72 75          nDestTru
3530: 6e 63 61 74 65 20 3d 20 6e 53 72 63 50 61 67 65  ncate = nSrcPage
3540: 20 2a 20 28 6e 53 72 63 50 61 67 65 73 69 7a 65   * (nSrcPagesize
3550: 2f 6e 44 65 73 74 50 61 67 65 73 69 7a 65 29 3b  /nDestPagesize);
3560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
3570: 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
3580: 61 74 65 49 6d 61 67 65 28 70 44 65 73 74 50 61  ateImage(pDestPa
3590: 67 65 72 2c 20 6e 44 65 73 74 54 72 75 6e 63 61  ger, nDestTrunca
35a0: 74 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  te);..      if( 
35b0: 6e 53 72 63 50 61 67 65 73 69 7a 65 3c 6e 44 65  nSrcPagesize<nDe
35c0: 73 74 50 61 67 65 73 69 7a 65 20 29 7b 0a 20 20  stPagesize ){.  
35d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35e0: 73 6f 75 72 63 65 20 70 61 67 65 2d 73 69 7a 65  source page-size
35f0: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
3600: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
3610: 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20 20   page-size,.    
3620: 20 20 20 20 2a 2a 20 74 77 6f 20 65 78 74 72 61      ** two extra
3630: 20 74 68 69 6e 67 73 20 6d 61 79 20 6e 65 65 64   things may need
3640: 20 74 6f 20 68 61 70 70 65 6e 3a 0a 20 20 20 20   to happen:.    
3650: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
3660: 2a 20 20 20 2a 20 54 68 65 20 64 65 73 74 69 6e  *   * The destin
3670: 61 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 20 74  ation may need t
3680: 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 2c 20  o be truncated, 
3690: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  and.        **. 
36a0: 20 20 20 20 20 20 20 2a 2a 20 20 20 2a 20 44 61         **   * Da
36b0: 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ta stored on the
36c0: 20 70 61 67 65 73 20 69 6d 6d 65 64 69 61 74 65   pages immediate
36d0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
36e0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
36f0: 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
3700: 67 65 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ge in the source
3710: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 65   database may ne
3720: 65 64 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ed to be.       
3730: 20 2a 2a 20 20 20 20 20 63 6f 70 69 65 64 20 69   **     copied i
3740: 6e 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74  nto the destinat
3750: 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ion database..  
3760: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3770: 20 63 6f 6e 73 74 20 69 36 34 20 69 53 69 7a 65   const i64 iSize
3780: 20 3d 20 28 69 36 34 29 6e 53 72 63 50 61 67 65   = (i64)nSrcPage
3790: 73 69 7a 65 20 2a 20 28 69 36 34 29 6e 53 72 63  size * (i64)nSrc
37a0: 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Page;.        sq
37b0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 20 63 6f 6e  lite3_file * con
37c0: 73 74 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  st pFile = sqlit
37d0: 65 33 50 61 67 65 72 46 69 6c 65 28 70 44 65 73  e3PagerFile(pDes
37e0: 74 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  tPager);..      
37f0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
3800: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3810: 74 28 20 28 69 36 34 29 6e 44 65 73 74 54 72 75  t( (i64)nDestTru
3820: 6e 63 61 74 65 2a 28 69 36 34 29 6e 44 65 73 74  ncate*(i64)nDest
3830: 50 61 67 65 73 69 7a 65 20 3e 3d 20 69 53 69 7a  Pagesize >= iSiz
3840: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
3850: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
3860: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
3870: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 44 65  mmitPhaseOne(pDe
3880: 73 74 50 61 67 65 72 2c 20 30 2c 20 31 29 29 0a  stPager, 0, 1)).
3890: 20 20 20 20 20 20 20 20 20 26 26 20 53 51 4c 49           && SQLI
38a0: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 62 61 63  TE_OK==(rc = bac
38b0: 6b 75 70 54 72 75 6e 63 61 74 65 46 69 6c 65 28  kupTruncateFile(
38c0: 70 46 69 6c 65 2c 20 69 53 69 7a 65 29 29 0a 20  pFile, iSize)). 
38d0: 20 20 20 20 20 20 20 20 26 26 20 53 51 4c 49 54          && SQLIT
38e0: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
38f0: 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 44 65  te3PagerSync(pDe
3900: 73 74 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  stPager)).      
3910: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
3920: 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  64 iOff;.       
3930: 20 20 20 69 36 34 20 69 45 6e 64 20 3d 20 4d 49     i64 iEnd = MI
3940: 4e 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 2b  N(PENDING_BYTE +
3950: 20 6e 44 65 73 74 50 61 67 65 73 69 7a 65 2c 20   nDestPagesize, 
3960: 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  iSize);.        
3970: 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20    for(.         
3980: 20 20 20 69 4f 66 66 3d 50 45 4e 44 49 4e 47 5f     iOff=PENDING_
3990: 42 59 54 45 2b 6e 53 72 63 50 61 67 65 73 69 7a  BYTE+nSrcPagesiz
39a0: 65 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e; .            
39b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
39c0: 20 69 4f 66 66 3c 69 45 6e 64 3b 20 0a 20 20 20   iOff<iEnd; .   
39d0: 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 3d 6e           iOff+=n
39e0: 53 72 63 50 61 67 65 73 69 7a 65 0a 20 20 20 20  SrcPagesize.    
39f0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
3a00: 20 20 20 20 20 50 67 48 64 72 20 2a 70 53 72 63       PgHdr *pSrc
3a10: 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pg = 0;.        
3a20: 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69      const Pgno i
3a30: 53 72 63 50 67 20 3d 20 28 50 67 6e 6f 29 28 28  SrcPg = (Pgno)((
3a40: 69 4f 66 66 2f 6e 53 72 63 50 61 67 65 73 69 7a  iOff/nSrcPagesiz
3a50: 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e)+1);.         
3a60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
3a70: 61 67 65 72 47 65 74 28 70 53 72 63 50 61 67 65  agerGet(pSrcPage
3a80: 72 2c 20 69 53 72 63 50 67 2c 20 26 70 53 72 63  r, iSrcPg, &pSrc
3a90: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
3aa0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3ab0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
3ac0: 20 20 20 20 75 38 20 2a 7a 44 61 74 61 20 3d 20      u8 *zData = 
3ad0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3ae0: 61 74 61 28 70 53 72 63 50 67 29 3b 0a 20 20 20  ata(pSrcPg);.   
3af0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
3b00: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
3b10: 46 69 6c 65 2c 20 7a 44 61 74 61 2c 20 6e 53 72  File, zData, nSr
3b20: 63 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29  cPagesize, iOff)
3b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
3b50: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 53  te3PagerUnref(pS
3b60: 72 63 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rcPg);.         
3b70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
3b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3ba0: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
3bb0: 65 28 70 44 65 73 74 50 61 67 65 72 2c 20 30 2c  e(pDestPager, 0,
3bc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a   0);.      }.  .
3bd0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
3be0: 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74  committing the t
3bf0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74 68  ransaction to th
3c00: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61  e destination da
3c10: 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  tabase. */.     
3c20: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
3c30: 72 63 0a 20 20 20 20 20 20 20 26 26 20 53 51 4c  rc.       && SQL
3c40: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
3c50: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
3c60: 50 68 61 73 65 54 77 6f 28 70 2d 3e 70 44 65 73  PhaseTwo(p->pDes
3c70: 74 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t)).      ){.   
3c80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3c90: 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
3ca0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
3cb0: 66 20 62 43 6c 6f 73 65 54 72 61 6e 73 20 69 73  f bCloseTrans is
3cc0: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
3cd0: 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 65 64   function opened
3ce0: 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
3cf0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ion.    ** on th
3d00: 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  e source databas
3d10: 65 2e 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61  e. Close the rea
3d20: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 65  d transaction he
3d30: 72 65 2e 20 54 68 65 72 65 20 69 73 0a 20 20 20  re. There is.   
3d40: 20 2a 2a 20 6e 6f 20 6e 65 65 64 20 74 6f 20 63   ** no need to c
3d50: 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
3d60: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 62 74  values of the bt
3d70: 72 65 65 20 6d 65 74 68 6f 64 73 20 68 65 72 65  ree methods here
3d80: 2c 20 61 73 0a 20 20 20 20 2a 2a 20 22 63 6f 6d  , as.    ** "com
3d90: 6d 69 74 74 69 6e 67 22 20 61 20 72 65 61 64 2d  mitting" a read-
3da0: 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
3db0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 0a 20 20   cannot fail..  
3dc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 6c    */.    if( bCl
3dd0: 6f 73 65 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  oseTrans ){.    
3de0: 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
3df0: 72 63 32 20 29 3b 0a 20 20 20 20 20 20 54 45 53  rc2 );.      TES
3e00: 54 4f 4e 4c 59 28 20 72 63 32 20 20 3d 20 29 20  TONLY( rc2  = ) 
3e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
3e20: 69 74 50 68 61 73 65 4f 6e 65 28 70 2d 3e 70 53  itPhaseOne(p->pS
3e30: 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45  rc, 0);.      TE
3e40: 53 54 4f 4e 4c 59 28 20 72 63 32 20 7c 3d 20 29  STONLY( rc2 |= )
3e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
3e60: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2d 3e 70  mitPhaseTwo(p->p
3e70: 53 72 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Src);.      asse
3e80: 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
3e90: 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OK );.    }.  . 
3ea0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
3eb0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73   }.  if( p->pDes
3ec0: 74 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tDb ){.    sqlit
3ed0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
3ee0: 2d 3e 70 44 65 73 74 44 62 2d 3e 6d 75 74 65 78  ->pDestDb->mutex
3ef0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3f00: 42 74 72 65 65 4c 65 61 76 65 28 70 2d 3e 70 53  BtreeLeave(p->pS
3f10: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
3f20: 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 53  utex_leave(p->pS
3f30: 72 63 44 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcDb->mutex);.  
3f40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3f50: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
3f60: 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69  resources associ
3f70: 61 74 65 64 20 77 69 74 68 20 61 6e 20 73 71 6c  ated with an sql
3f80: 69 74 65 33 5f 62 61 63 6b 75 70 2a 20 68 61 6e  ite3_backup* han
3f90: 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
3fa0: 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
3fb0: 68 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  h(sqlite3_backup
3fc0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
3fd0: 62 61 63 6b 75 70 20 2a 2a 70 70 3b 20 20 20 20  backup **pp;    
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ff0: 50 74 72 20 74 6f 20 68 65 61 64 20 6f 66 20 70  Ptr to head of p
4000: 61 67 65 72 73 20 62 61 63 6b 75 70 20 6c 69 73  agers backup lis
4010: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t */.  sqlite3_m
4020: 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
4030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4040: 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63 74 20  utex to protect 
4050: 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
4060: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
4090: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
40a0: 0a 20 20 2f 2a 20 45 6e 74 65 72 20 74 68 65 20  .  /* Enter the 
40b0: 6d 75 74 65 78 65 73 20 2a 2f 0a 20 20 73 71 6c  mutexes */.  sql
40c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
40d0: 28 70 2d 3e 70 53 72 63 44 62 2d 3e 6d 75 74 65  (p->pSrcDb->mute
40e0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
40f0: 65 65 45 6e 74 65 72 28 70 2d 3e 70 53 72 63 29  eeEnter(p->pSrc)
4100: 3b 0a 20 20 6d 75 74 65 78 20 3d 20 70 2d 3e 70  ;.  mutex = p->p
4110: 53 72 63 44 62 2d 3e 6d 75 74 65 78 3b 0a 20 20  SrcDb->mutex;.  
4120: 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29  if( p->pDestDb )
4130: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
4140: 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 44 65  tex_enter(p->pDe
4150: 73 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  stDb->mutex);.  
4160: 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
4170: 68 69 73 20 62 61 63 6b 75 70 20 66 72 6f 6d 20  his backup from 
4180: 74 68 65 20 73 6f 75 72 63 65 20 70 61 67 65 72  the source pager
4190: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 44  . */.  if( p->pD
41a0: 65 73 74 44 62 20 29 7b 0a 20 20 20 20 70 70 20  estDb ){.    pp 
41b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 61  = sqlite3PagerBa
41c0: 63 6b 75 70 50 74 72 28 73 71 6c 69 74 65 33 42  ckupPtr(sqlite3B
41d0: 74 72 65 65 50 61 67 65 72 28 70 2d 3e 70 53 72  treePager(p->pSr
41e0: 63 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  c));.    while( 
41f0: 2a 70 70 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  *pp!=p ){.      
4200: 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
4210: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  xt;.    }.    *p
4220: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
4230: 20 20 70 2d 3e 70 53 72 63 2d 3e 6e 42 61 63 6b    p->pSrc->nBack
4240: 75 70 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  up--;.  }..  /* 
4250: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
4260: 20 69 73 20 73 74 69 6c 6c 20 6f 70 65 6e 20 6f   is still open o
4270: 6e 20 74 68 65 20 42 74 72 65 65 2c 20 72 6f 6c  n the Btree, rol
4280: 6c 20 69 74 20 62 61 63 6b 2e 20 2a 2f 0a 20 20  l it back. */.  
4290: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
42a0: 62 61 63 6b 28 70 2d 3e 70 44 65 73 74 29 3b 0a  back(p->pDest);.
42b0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 65 72  .  /* Set the er
42c0: 72 6f 72 20 63 6f 64 65 20 6f 66 20 74 68 65 20  ror code of the 
42d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
42e0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a  base handle. */.
42f0: 20 20 72 63 20 3d 20 28 70 2d 3e 72 63 3d 3d 53    rc = (p->rc==S
4300: 51 4c 49 54 45 5f 44 4f 4e 45 29 20 3f 20 53 51  QLITE_DONE) ? SQ
4310: 4c 49 54 45 5f 4f 4b 20 3a 20 70 2d 3e 72 63 3b  LITE_OK : p->rc;
4320: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
4330: 70 2d 3e 70 44 65 73 74 44 62 2c 20 72 63 2c 20  p->pDestDb, rc, 
4340: 30 29 3b 0a 0a 20 20 2f 2a 20 45 78 69 74 20 74  0);..  /* Exit t
4350: 68 65 20 6d 75 74 65 78 65 73 20 61 6e 64 20 66  he mutexes and f
4360: 72 65 65 20 74 68 65 20 62 61 63 6b 75 70 20 63  ree the backup c
4370: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
4380: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 44  . */.  if( p->pD
4390: 65 73 74 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  estDb ){.    sql
43a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
43b0: 28 70 2d 3e 70 44 65 73 74 44 62 2d 3e 6d 75 74  (p->pDestDb->mut
43c0: 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
43d0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 2d 3e  e3BtreeLeave(p->
43e0: 70 53 72 63 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pSrc);.  if( p->
43f0: 70 44 65 73 74 44 62 20 29 7b 0a 20 20 20 20 73  pDestDb ){.    s
4400: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
4410: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
4420: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
4430: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4440: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4450: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4460: 65 73 20 73 74 69 6c 6c 20 74 6f 20 62 65 20 62  es still to be b
4470: 61 63 6b 65 64 20 75 70 20 61 73 20 6f 66 20 74  acked up as of t
4480: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
4490: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
44a0: 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 2e  3_backup_step().
44b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
44c0: 62 61 63 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67  backup_remaining
44d0: 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20  (sqlite3_backup 
44e0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
44f0: 3e 6e 52 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a  >nRemaining;.}..
4500: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4510: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
4520: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 6f   pages in the so
4530: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 61 73  urce database as
4540: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 0a 2a 2a   of the most .**
4550: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
4560: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
4570: 74 65 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tep()..*/.int sq
4580: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 70 61 67  lite3_backup_pag
4590: 65 63 6f 75 6e 74 28 73 71 6c 69 74 65 33 5f 62  ecount(sqlite3_b
45a0: 61 63 6b 75 70 20 2a 70 29 7b 0a 20 20 72 65 74  ackup *p){.  ret
45b0: 75 72 6e 20 70 2d 3e 6e 50 61 67 65 63 6f 75 6e  urn p->nPagecoun
45c0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
45d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
45e0: 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 63 6f  led after the co
45f0: 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 69  ntents of page i
4600: 50 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 73  Page of the.** s
4610: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 68  ource database h
4620: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
4630: 64 2e 20 49 66 20 70 61 67 65 20 69 50 61 67 65  d. If page iPage
4640: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
4650: 6e 20 0a 2a 2a 20 63 6f 70 69 65 64 20 69 6e 74  n .** copied int
4660: 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  o the destinatio
4670: 6e 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  n database, then
4680: 20 74 68 65 20 64 61 74 61 20 77 72 69 74 74 65   the data writte
4690: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 73 74  n to the.** dest
46a0: 69 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 77 20 69  ination is now i
46b0: 6e 76 61 6c 69 64 61 74 65 64 2e 20 54 68 65 20  nvalidated. The 
46c0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 63 6f 70 79  destination copy
46d0: 20 6f 66 20 69 50 61 67 65 20 6e 65 65 64 73 0a   of iPage needs.
46e0: 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ** to be updated
46f0: 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 61   with the new da
4700: 74 61 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ta before the ba
4710: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 20 69  ckup operation i
4720: 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s.** complete..*
4730: 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
4740: 65 64 20 74 68 61 74 20 74 68 65 20 6d 75 74 65  ed that the mute
4750: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
4760: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  h the BtShared o
4770: 62 6a 65 63 74 0a 2a 2a 20 63 6f 72 72 65 73 70  bject.** corresp
4780: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 6f  onding to the so
4790: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
47a0: 20 68 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20   held when this 
47b0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
47c0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  alled..*/.void s
47d0: 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
47e0: 74 65 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  te(sqlite3_backu
47f0: 70 20 2a 70 42 61 63 6b 75 70 2c 20 50 67 6e 6f  p *pBackup, Pgno
4800: 20 69 50 61 67 65 2c 20 63 6f 6e 73 74 20 75 38   iPage, const u8
4810: 20 2a 61 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *aData){.  sqli
4820: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 3b 20 20  te3_backup *p;  
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
4850: 69 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 70  iable */.  for(p
4860: 3d 70 42 61 63 6b 75 70 3b 20 70 3b 20 70 3d 70  =pBackup; p; p=p
4870: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73  ->pNext){.    as
4880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4890: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 72 63  tex_held(p->pSrc
48a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
48b0: 0a 20 20 20 20 69 66 28 20 21 69 73 46 61 74 61  .    if( !isFata
48c0: 6c 45 72 72 6f 72 28 70 2d 3e 72 63 29 20 26 26  lError(p->rc) &&
48d0: 20 69 50 61 67 65 3c 70 2d 3e 69 4e 65 78 74 20   iPage<p->iNext 
48e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
48f0: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 20 70  backup process p
4900: 20 68 61 73 20 61 6c 72 65 61 64 79 20 63 6f 70   has already cop
4910: 69 65 64 20 70 61 67 65 20 69 50 61 67 65 2e 20  ied page iPage. 
4920: 42 75 74 20 6e 6f 77 20 69 74 0a 20 20 20 20 20  But now it.     
4930: 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
4940: 69 66 69 65 64 20 62 79 20 61 20 74 72 61 6e 73  ified by a trans
4950: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6f  action on the so
4960: 75 72 63 65 20 70 61 67 65 72 2e 20 43 6f 70 79  urce pager. Copy
4970: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
4980: 77 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  w data into the 
4990: 62 61 63 6b 75 70 2e 0a 20 20 20 20 20 20 2a 2f  backup..      */
49a0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
49b0: 62 61 63 6b 75 70 4f 6e 65 50 61 67 65 28 70 2c  backupOnePage(p,
49c0: 20 69 50 61 67 65 2c 20 61 44 61 74 61 29 3b 0a   iPage, aData);.
49d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
49e0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  !=SQLITE_BUSY &&
49f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc!=SQLITE_LOCK
4a00: 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
4a10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4a20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
4a30: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
4a40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4a50: 52 65 73 74 61 72 74 20 74 68 65 20 62 61 63 6b  Restart the back
4a60: 75 70 20 70 72 6f 63 65 73 73 2e 20 54 68 69 73  up process. This
4a70: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4a80: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 0a  the pager layer.
4a90: 2a 2a 20 64 65 74 65 63 74 73 20 74 68 61 74 20  ** detects that 
4aa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
4ab0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
4ac0: 79 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 64 61  y an external da
4ad0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
4ae0: 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
4af0: 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  se there is no w
4b00: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 77 68  ay of knowing wh
4b10: 69 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  ich of the.** pa
4b20: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
4b30: 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  en copied into t
4b40: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64  he destination d
4b50: 61 74 61 62 61 73 65 20 61 72 65 20 73 74 69 6c  atabase are stil
4b60: 6c 20 0a 2a 2a 20 76 61 6c 69 64 20 61 6e 64 20  l .** valid and 
4b70: 77 68 69 63 68 20 61 72 65 20 6e 6f 74 2c 20 73  which are not, s
4b80: 6f 20 74 68 65 20 65 6e 74 69 72 65 20 70 72 6f  o the entire pro
4b90: 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  cess needs to be
4ba0: 20 72 65 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a   restarted..**.*
4bb0: 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
4bc0: 74 68 61 74 20 74 68 65 20 6d 75 74 65 78 20 61  that the mutex a
4bd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4be0: 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
4bf0: 63 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ct.** correspond
4c00: 69 6e 67 20 74 6f 20 74 68 65 20 73 6f 75 72 63  ing to the sourc
4c10: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 68 65  e database is he
4c20: 6c 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ld when this fun
4c30: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
4c40: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4c50: 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
4c60: 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20  (sqlite3_backup 
4c70: 2a 70 42 61 63 6b 75 70 29 7b 0a 20 20 73 71 6c  *pBackup){.  sql
4c80: 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 3b 20  ite3_backup *p; 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
4cb0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28  riable */.  for(
4cc0: 70 3d 70 42 61 63 6b 75 70 3b 20 70 3b 20 70 3d  p=pBackup; p; p=
4cd0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  p->pNext){.    a
4ce0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4cf0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 72  utex_held(p->pSr
4d00: 63 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  c->pBt->mutex) )
4d10: 3b 0a 20 20 20 20 70 2d 3e 69 4e 65 78 74 20 3d  ;.    p->iNext =
4d20: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64   1;.  }.}..#ifnd
4d30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4d40: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  ACUUM./*.** Copy
4d50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
4d60: 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d  ntent of pBtFrom
4d70: 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20   into pBtTo.  A 
4d80: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
4d90: 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f  ust be active fo
4da0: 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a  r both files..**
4db0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
4dc0: 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65 20  file pTo may be 
4dd0: 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20  reduced by this 
4de0: 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 61 6e  operation. If an
4df0: 79 74 68 69 6e 67 20 0a 2a 2a 20 67 6f 65 73 20  ything .** goes 
4e00: 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
4e10: 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73  action on pTo is
4e20: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
4e30: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
4e40: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
4e50: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 65   is committed be
4e60: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
4e70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
4e80: 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
4e90: 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
4ea0: 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  From){.  int rc;
4eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
4ec0: 70 20 62 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  p b;.  sqlite3Bt
4ed0: 72 65 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20  reeEnter(pTo);. 
4ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4ef0: 65 72 28 70 46 72 6f 6d 29 3b 0a 0a 20 20 2f 2a  er(pFrom);..  /*
4f00: 20 53 65 74 20 75 70 20 61 6e 20 73 71 6c 69 74   Set up an sqlit
4f10: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
4f20: 2e 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  . sqlite3_backup
4f30: 2e 70 44 65 73 74 44 62 20 6d 75 73 74 20 62 65  .pDestDb must be
4f40: 20 73 65 74 0a 20 20 2a 2a 20 74 6f 20 30 2e 20   set.  ** to 0. 
4f50: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
4f60: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
4f70: 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ons of sqlite3_b
4f80: 61 63 6b 75 70 5f 73 74 65 70 28 29 0a 20 20 2a  ackup_step().  *
4f90: 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  * and sqlite3_ba
4fa0: 63 6b 75 70 5f 66 69 6e 69 73 68 28 29 20 74 6f  ckup_finish() to
4fb0: 20 64 65 74 65 63 74 20 74 68 61 74 20 74 68 65   detect that the
4fc0: 79 20 61 72 65 20 62 65 69 6e 67 20 63 61 6c 6c  y are being call
4fd0: 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69  ed.  ** from thi
4fe0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20  s function, not 
4ff0: 64 69 72 65 63 74 6c 79 20 62 79 20 74 68 65 20  directly by the 
5000: 75 73 65 72 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  user..  */.  mem
5010: 73 65 74 28 26 62 2c 20 30 2c 20 73 69 7a 65 6f  set(&b, 0, sizeo
5020: 66 28 62 29 29 3b 0a 20 20 62 2e 70 53 72 63 44  f(b));.  b.pSrcD
5030: 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 20  b = pFrom->db;. 
5040: 20 62 2e 70 53 72 63 20 3d 20 70 46 72 6f 6d 3b   b.pSrc = pFrom;
5050: 0a 20 20 62 2e 70 44 65 73 74 20 3d 20 70 54 6f  .  b.pDest = pTo
5060: 3b 0a 20 20 62 2e 69 4e 65 78 74 20 3d 20 31 3b  ;.  b.iNext = 1;
5070: 0a 0a 20 20 2f 2a 20 30 78 37 46 46 46 46 46 46  ..  /* 0x7FFFFFF
5080: 46 20 69 73 20 74 68 65 20 68 61 72 64 20 6c 69  F is the hard li
5090: 6d 69 74 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  mit for the numb
50a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
50b0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
50c0: 69 6c 65 2e 20 42 79 20 70 61 73 73 69 6e 67 20  ile. By passing 
50d0: 74 68 69 73 20 61 73 20 74 68 65 20 6e 75 6d 62  this as the numb
50e0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 63  er of pages to c
50f0: 6f 70 79 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  opy to.  ** sqli
5100: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
5110: 29 2c 20 77 65 20 63 61 6e 20 67 75 61 72 61 6e  ), we can guaran
5120: 74 65 65 20 74 68 61 74 20 74 68 65 20 63 6f 70  tee that the cop
5130: 79 20 66 69 6e 69 73 68 65 73 20 0a 20 20 2a 2a  y finishes .  **
5140: 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c 65   within a single
5150: 20 63 61 6c 6c 20 28 75 6e 6c 65 73 73 20 61 6e   call (unless an
5160: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 29 2e 20   error occurs). 
5170: 54 68 65 20 61 73 73 65 72 74 28 29 20 73 74 61  The assert() sta
5180: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 63 68 65 63  tement.  ** chec
5190: 6b 73 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  ks this assumpti
51a0: 6f 6e 20 2d 20 28 70 2d 3e 72 63 29 20 73 68 6f  on - (p->rc) sho
51b0: 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 65 69  uld be set to ei
51c0: 74 68 65 72 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ther SQLITE_DONE
51d0: 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72   .  ** or an err
51e0: 6f 72 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  or code..  */.  
51f0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
5200: 74 65 70 28 26 62 2c 20 30 78 37 46 46 46 46 46  tep(&b, 0x7FFFFF
5210: 46 46 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  FF);.  assert( b
5220: 2e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  .rc!=SQLITE_OK )
5230: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5240: 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 26  _backup_finish(&
5250: 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
5260: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
5270: 54 6f 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  To->pBt->pageSiz
5280: 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  eFixed = 0;.  }.
5290: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
52a0: 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
52b0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
52c0: 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
52d0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
52e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
52f0: 55 4d 20 2a 2f 0a                                UM */.