/ Hex Artifact Content
Login

Artifact 1cfa5ed161dc3adede5cf7bb5baa0d03c9d7488c:


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 35 20   backup.c,v 1.5 
0200: 32 30 30 39 2f 30 32 2f 30 34 20 30 31 3a 34 39  2009/02/04 01:49
0210: 3a 33 30 20 73 68 61 6e 65 20 45 78 70 20 24 0a  :30 shane Exp $.
0220: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0230: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0240: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0250: 0a 2f 2a 20 4d 61 63 72 6f 20 74 6f 20 66 69 6e  ./* Macro to fin
0260: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66  d the minimum of
0270: 20 74 77 6f 20 6e 75 6d 65 72 69 63 20 76 61 6c   two numeric val
0280: 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ues..*/.#ifndef 
0290: 4d 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e  MIN.# define MIN
02a0: 28 78 2c 79 29 20 28 28 78 29 3c 28 79 29 3f 28  (x,y) ((x)<(y)?(
02b0: 78 29 3a 28 79 29 29 0a 23 65 6e 64 69 66 0a 0a  x):(y)).#endif..
02c0: 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
02d0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
02e0: 63 68 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ch backup operat
02f0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  ion..*/.struct s
0300: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 7b 0a  qlite3_backup {.
0310: 20 20 73 71 6c 69 74 65 33 2a 20 70 44 65 73 74    sqlite3* pDest
0320: 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 65  Db;        /* De
0330: 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61  stination databa
0340: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
0350: 74 72 65 65 20 2a 70 44 65 73 74 3b 20 20 20 20  tree *pDest;    
0360: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 69          /* Desti
0370: 6e 61 74 69 6f 6e 20 62 2d 74 72 65 65 20 66 69  nation b-tree fi
0380: 6c 65 20 2a 2f 0a 20 20 75 33 32 20 69 44 65 73  le */.  u32 iDes
0390: 74 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 20  tSchema;        
03a0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 73 63 68   /* Original sch
03b0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20 64 65  ema cookie in de
03c0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  stination */.  i
03d0: 6e 74 20 62 44 65 73 74 4c 6f 63 6b 65 64 3b 20  nt bDestLocked; 
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
03f0: 6f 6e 63 65 20 61 20 77 72 69 74 65 2d 74 72 61  once a write-tra
0400: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
0410: 20 6f 6e 20 70 44 65 73 74 20 2a 2f 0a 0a 20 20   on pDest */..  
0420: 50 67 6e 6f 20 69 4e 65 78 74 3b 20 20 20 20 20  Pgno iNext;     
0430: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
0440: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
0450: 65 78 74 20 73 6f 75 72 63 65 20 70 61 67 65 20  ext source page 
0460: 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 73 71 6c  to copy */.  sql
0470: 69 74 65 33 2a 20 70 53 72 63 44 62 3b 20 20 20  ite3* pSrcDb;   
0480: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
0490: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
04a0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 53 72 63  */.  Btree *pSrc
04b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
04c0: 20 53 6f 75 72 63 65 20 62 2d 74 72 65 65 20 66   Source b-tree f
04d0: 69 6c 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ile */..  int rc
04e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
04f0: 20 20 20 2f 2a 20 42 61 63 6b 75 70 20 70 72 6f     /* Backup pro
0500: 63 65 73 73 20 65 72 72 6f 72 20 63 6f 64 65 20  cess error code 
0510: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 74  */..  /* These t
0520: 77 6f 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  wo variables are
0530: 20 73 65 74 20 62 79 20 65 76 65 72 79 20 63 61   set by every ca
0540: 6c 6c 20 74 6f 20 62 61 63 6b 75 70 5f 73 74 65  ll to backup_ste
0550: 70 28 29 2e 20 54 68 65 79 20 61 72 65 0a 20 20  p(). They are.  
0560: 2a 2a 20 72 65 61 64 20 62 79 20 63 61 6c 6c 73  ** read by calls
0570: 20 74 6f 20 62 61 63 6b 75 70 5f 72 65 6d 61 69   to backup_remai
0580: 6e 69 6e 67 28 29 20 61 6e 64 20 62 61 63 6b 75  ning() and backu
0590: 70 5f 70 61 67 65 63 6f 75 6e 74 28 29 2e 0a 20  p_pagecount().. 
05a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 52 65 6d 61   */.  Pgno nRema
05b0: 69 6e 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  ining;         /
05c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
05d0: 73 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a  s left to copy *
05e0: 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 63 6f  /.  Pgno nPageco
05f0: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  unt;         /* 
0600: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
0610: 70 61 67 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  pages to copy */
0620: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ..  sqlite3_back
0630: 75 70 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  up *pNext;   /* 
0640: 4e 65 78 74 20 62 61 63 6b 75 70 20 61 73 73 6f  Next backup asso
0650: 63 69 61 74 65 64 20 77 69 74 68 20 73 6f 75 72  ciated with sour
0660: 63 65 20 70 61 67 65 72 20 2a 2f 0a 7d 3b 0a 0a  ce pager */.};..
0670: 2f 2a 0a 2a 2a 20 54 48 52 45 41 44 20 53 41 46  /*.** THREAD SAF
0680: 45 54 59 20 4e 4f 54 45 53 3a 0a 2a 2a 0a 2a 2a  ETY NOTES:.**.**
0690: 20 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 62     Once it has b
06a0: 65 65 6e 20 63 72 65 61 74 65 64 20 75 73 69 6e  een created usin
06b0: 67 20 62 61 63 6b 75 70 5f 69 6e 69 74 28 29 2c  g backup_init(),
06c0: 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65   a single sqlite
06d0: 33 5f 62 61 63 6b 75 70 0a 2a 2a 20 20 20 73 74  3_backup.**   st
06e0: 72 75 63 74 75 72 65 20 6d 61 79 20 62 65 20 61  ructure may be a
06f0: 63 63 65 73 73 65 64 20 76 69 61 20 74 77 6f 20  ccessed via two 
0700: 67 72 6f 75 70 73 20 6f 66 20 74 68 72 65 61 64  groups of thread
0710: 2d 73 61 66 65 20 65 6e 74 72 79 20 70 6f 69 6e  -safe entry poin
0720: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ts:.**.**     * 
0730: 56 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Via the sqlite3_
0740: 62 61 63 6b 75 70 5f 58 58 58 28 29 20 41 50 49  backup_XXX() API
0750: 20 66 75 6e 63 74 69 6f 6e 20 62 61 63 6b 75 70   function backup
0760: 5f 73 74 65 70 28 29 20 61 6e 64 20 0a 2a 2a 20  _step() and .** 
0770: 20 20 20 20 20 20 62 61 63 6b 75 70 5f 66 69 6e        backup_fin
0780: 69 73 68 28 29 2e 20 42 6f 74 68 20 74 68 65 73  ish(). Both thes
0790: 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 62 74 61  e functions obta
07a0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 61  in the source da
07b0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
07c0: 68 61 6e 64 6c 65 20 6d 75 74 65 78 20 61 6e 64  handle mutex and
07d0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
07e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
07f0: 6f 75 72 63 65 20 42 74 53 68 61 72 65 64 20 0a  ource BtShared .
0800: 2a 2a 20 20 20 20 20 20 20 73 74 72 75 63 74 75  **       structu
0810: 72 65 2c 20 69 6e 20 74 68 61 74 20 6f 72 64 65  re, in that orde
0820: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 56  r..**.**     * V
0830: 69 61 20 74 68 65 20 42 61 63 6b 75 70 55 70 64  ia the BackupUpd
0840: 61 74 65 28 29 20 61 6e 64 20 42 61 63 6b 75 70  ate() and Backup
0850: 52 65 73 74 61 72 74 28 29 20 66 75 6e 63 74 69  Restart() functi
0860: 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0a 2a  ons, which are.*
0870: 2a 20 20 20 20 20 20 20 69 6e 76 6f 6b 65 64 20  *       invoked 
0880: 62 79 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  by the pager lay
0890: 65 72 20 74 6f 20 72 65 70 6f 72 74 20 76 61 72  er to report var
08a0: 69 6f 75 73 20 73 74 61 74 65 20 63 68 61 6e 67  ious state chang
08b0: 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 74  es in.**       t
08c0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
08d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
08e0: 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  e source databas
08f0: 65 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  e. The mutex.** 
0900: 20 20 20 20 20 20 61 73 73 6f 63 69 61 74 65 64        associated
0910: 20 77 69 74 68 20 74 68 65 20 73 6f 75 72 63 65   with the source
0920: 20 64 61 74 61 62 61 73 65 20 42 74 53 68 61 72   database BtShar
0930: 65 64 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  ed structure wil
0940: 6c 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20  l always .**    
0950: 20 20 20 62 65 20 68 65 6c 64 20 77 68 65 6e 20     be held when 
0960: 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
0970: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e  functions are in
0980: 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  voked..**.**   T
0990: 68 65 20 6f 74 68 65 72 20 73 71 6c 69 74 65 33  he other sqlite3
09a0: 5f 62 61 63 6b 75 70 5f 58 58 58 28 29 20 41 50  _backup_XXX() AP
09b0: 49 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 61 63  I functions, bac
09c0: 6b 75 70 5f 72 65 6d 61 69 6e 69 6e 67 28 29 20  kup_remaining() 
09d0: 61 6e 64 0a 2a 2a 20 20 20 62 61 63 6b 75 70 5f  and.**   backup_
09e0: 70 61 67 65 63 6f 75 6e 74 28 29 20 61 72 65 20  pagecount() are 
09f0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 20  not thread-safe 
0a00: 66 75 6e 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  functions. If th
0a10: 65 79 20 61 72 65 20 63 61 6c 6c 65 64 0a 2a 2a  ey are called.**
0a20: 20 20 20 77 68 69 6c 65 20 73 6f 6d 65 20 6f 74     while some ot
0a30: 68 65 72 20 74 68 72 65 61 64 20 69 73 20 63 61  her thread is ca
0a40: 6c 6c 69 6e 67 20 62 61 63 6b 75 70 5f 73 74 65  lling backup_ste
0a50: 70 28 29 20 6f 72 20 62 61 63 6b 75 70 5f 66 69  p() or backup_fi
0a60: 6e 69 73 68 28 29 2c 0a 2a 2a 20 20 20 74 68 65  nish(),.**   the
0a70: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
0a80: 20 6d 61 79 20 62 65 20 69 6e 76 61 6c 69 64 2e   may be invalid.
0a90: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   There is no way
0aa0: 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 0a 2a   for a call to.*
0ab0: 2a 20 20 20 42 61 63 6b 75 70 55 70 64 61 74 65  *   BackupUpdate
0ac0: 28 29 20 6f 72 20 42 61 63 6b 75 70 52 65 73 74  () or BackupRest
0ad0: 61 72 74 28 29 20 74 6f 20 69 6e 74 65 72 66 65  art() to interfe
0ae0: 72 65 20 77 69 74 68 20 62 61 63 6b 75 70 5f 72  re with backup_r
0af0: 65 6d 61 69 6e 69 6e 67 28 29 0a 2a 2a 20 20 20  emaining().**   
0b00: 6f 72 20 62 61 63 6b 75 70 5f 70 61 67 65 63 6f  or backup_pageco
0b10: 75 6e 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44  unt()..**.**   D
0b20: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
0b30: 53 51 4c 69 74 65 20 63 6f 6e 66 69 67 75 72 61  SQLite configura
0b40: 74 69 6f 6e 2c 20 74 68 65 20 64 61 74 61 62 61  tion, the databa
0b50: 73 65 20 68 61 6e 64 6c 65 73 20 61 6e 64 2f 6f  se handles and/o
0b60: 72 0a 2a 2a 20 20 20 74 68 65 20 42 74 72 65 65  r.**   the Btree
0b70: 20 6f 62 6a 65 63 74 73 20 6d 61 79 20 68 61 76   objects may hav
0b80: 65 20 74 68 65 69 72 20 6f 77 6e 20 6d 75 74 65  e their own mute
0b90: 78 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  xes that require
0ba0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 4e   locking..**   N
0bb0: 6f 6e 2d 73 68 61 72 61 62 6c 65 20 42 74 72 65  on-sharable Btre
0bc0: 65 73 20 28 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  es (in-memory da
0bd0: 74 61 62 61 73 65 73 20 66 6f 72 20 65 78 61 6d  tabases for exam
0be0: 70 6c 65 29 2c 20 64 6f 20 6e 6f 74 20 68 61 76  ple), do not hav
0bf0: 65 0a 2a 2a 20 20 20 61 73 73 6f 63 69 61 74 65  e.**   associate
0c00: 64 20 6d 75 74 65 78 65 73 2e 0a 2a 2f 0a 0a 2f  d mutexes..*/../
0c10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
0c20: 69 6e 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  inter correspond
0c30: 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
0c40: 7a 44 62 20 28 69 2e 65 2e 20 22 6d 61 69 6e 22  zDb (i.e. "main"
0c50: 2c 20 22 74 65 6d 70 22 29 0a 2a 2a 20 69 6e 20  , "temp").** in 
0c60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
0c70: 65 20 70 44 62 2e 20 49 66 20 73 75 63 68 20 61  e pDb. If such a
0c80: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
0c90: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
0ca0: 6e 0a 2a 2a 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n.** a NULL poin
0cb0: 74 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 6e  ter and write an
0cc0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
0cd0: 6f 20 70 45 72 72 6f 72 44 62 2e 0a 2a 2a 0a 2a  o pErrorDb..**.*
0ce0: 2a 20 49 66 20 74 68 65 20 22 74 65 6d 70 22 20  * If the "temp" 
0cf0: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
0d00: 65 73 74 65 64 2c 20 69 74 20 6d 61 79 20 6e 65  ested, it may ne
0d10: 65 64 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  ed to be opened 
0d20: 62 79 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  by this .** func
0d30: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
0d40: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
0d50: 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20  oing so, return 
0d60: 30 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 0a  0 and write an .
0d70: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
0d80: 20 74 6f 20 70 45 72 72 6f 72 44 62 2e 0a 2a 2f   to pErrorDb..*/
0d90: 0a 73 74 61 74 69 63 20 42 74 72 65 65 20 2a 66  .static Btree *f
0da0: 69 6e 64 42 74 72 65 65 28 73 71 6c 69 74 65 33  indBtree(sqlite3
0db0: 20 2a 70 45 72 72 6f 72 44 62 2c 20 73 71 6c 69   *pErrorDb, sqli
0dc0: 74 65 33 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  te3 *pDb, const 
0dd0: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e  char *zDb){.  in
0de0: 74 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  t i = sqlite3Fin
0df0: 64 44 62 4e 61 6d 65 28 70 44 62 2c 20 7a 44 62  dDbName(pDb, zDb
0e00: 29 3b 0a 0a 20 20 69 66 28 20 69 3d 3d 31 20 29  );..  if( i==1 )
0e10: 7b 0a 20 20 20 20 50 61 72 73 65 20 73 50 61 72  {.    Parse sPar
0e20: 73 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  se;.    memset(&
0e30: 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f  sParse, 0, sizeo
0e40: 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20 20 20  f(sParse));.    
0e50: 73 50 61 72 73 65 2e 64 62 20 3d 20 70 44 62 3b  sParse.db = pDb;
0e60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0e70: 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
0e80: 28 26 73 50 61 72 73 65 29 20 29 7b 0a 20 20 20  (&sParse) ){.   
0e90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
0ea0: 6c 65 61 72 28 26 73 50 61 72 73 65 29 3b 0a 20  lear(&sParse);. 
0eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
0ec0: 72 28 70 45 72 72 6f 72 44 62 2c 20 73 50 61 72  r(pErrorDb, sPar
0ed0: 73 65 2e 72 63 2c 20 22 25 73 22 2c 20 73 50 61  se.rc, "%s", sPa
0ee0: 72 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  rse.zErrMsg);.  
0ef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0f00: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
0f10: 73 50 61 72 73 65 2e 7a 45 72 72 4d 73 67 3d 3d  sParse.zErrMsg==
0f20: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
0f30: 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
0f40: 65 33 45 72 72 6f 72 28 70 45 72 72 6f 72 44 62  e3Error(pErrorDb
0f50: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
0f60: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
0f70: 65 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 20  e %s", zDb);.   
0f80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
0f90: 20 20 72 65 74 75 72 6e 20 70 44 62 2d 3e 61 44    return pDb->aD
0fa0: 62 5b 69 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a  b[i].pBt;.}../*.
0fb0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 73 71 6c  ** Create an sql
0fc0: 69 74 65 33 5f 62 61 63 6b 75 70 20 70 72 6f 63  ite3_backup proc
0fd0: 65 73 73 20 74 6f 20 63 6f 70 79 20 74 68 65 20  ess to copy the 
0fe0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 7a 53 72 63  contents of zSrc
0ff0: 44 62 20 66 72 6f 6d 0a 2a 2a 20 63 6f 6e 6e 65  Db from.** conne
1000: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 70 53 72  ction handle pSr
1010: 63 44 62 20 74 6f 20 7a 44 65 73 74 44 62 20 69  cDb to zDestDb i
1020: 6e 20 70 44 65 73 74 44 62 2e 20 49 66 20 73 75  n pDestDb. If su
1030: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1040: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
1050: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
1060: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 2e 0a  _backup object..
1070: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1080: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1090: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
10a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
10b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
10c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  * stored in data
10d0: 62 61 73 65 20 68 61 6e 64 6c 65 20 70 44 65 73  base handle pDes
10e0: 74 44 62 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  tDb..*/.sqlite3_
10f0: 62 61 63 6b 75 70 20 2a 73 71 6c 69 74 65 33 5f  backup *sqlite3_
1100: 62 61 63 6b 75 70 5f 69 6e 69 74 28 0a 20 20 73  backup_init(.  s
1110: 71 6c 69 74 65 33 2a 20 70 44 65 73 74 44 62 2c  qlite3* pDestDb,
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1140: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1150: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1160: 65 73 74 44 62 2c 20 20 20 20 20 20 20 20 20 20  estDb,          
1170: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1180: 6f 66 20 64 61 74 61 62 61 73 65 20 77 69 74 68  of database with
1190: 69 6e 20 70 44 65 73 74 44 62 20 2a 2f 0a 20 20  in pDestDb */.  
11a0: 73 71 6c 69 74 65 33 2a 20 70 53 72 63 44 62 2c  sqlite3* pSrcDb,
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
11e0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 63  read from */.  c
11f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 44  onst char *zSrcD
1200: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
1210: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1220: 64 61 74 61 62 61 73 65 20 77 69 74 68 69 6e 20  database within 
1230: 70 53 72 63 44 62 20 2a 2f 0a 29 7b 0a 20 20 73  pSrcDb */.){.  s
1240: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1270: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
1280: 20 4c 6f 63 6b 20 74 68 65 20 73 6f 75 72 63 65   Lock the source
1290: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12a0: 2e 20 54 68 65 20 64 65 73 74 69 6e 61 74 69 6f  . The destinatio
12b0: 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
12c0: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  handle is not lo
12d0: 63 6b 65 64 20 69 6e 20 74 68 69 73 20 72 6f 75  cked in this rou
12e0: 74 69 6e 65 2c 20 62 75 74 20 69 74 20 69 73 20  tine, but it is 
12f0: 6c 6f 63 6b 65 64 20 69 6e 0a 20 20 2a 2a 20 73  locked in.  ** s
1300: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
1310: 65 70 28 29 2e 20 54 68 65 20 75 73 65 72 20 69  ep(). The user i
1320: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e  s required to en
1330: 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 20 20 2a  sure that no.  *
1340: 2a 20 6f 74 68 65 72 20 74 68 72 65 61 64 20 61  * other thread a
1350: 63 63 65 73 73 65 73 20 74 68 65 20 64 65 73 74  ccesses the dest
1360: 69 6e 61 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  ination handle f
1370: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 0a  or the duration.
1380: 20 20 2a 2a 20 6f 66 20 74 68 65 20 62 61 63 6b    ** of the back
1390: 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  up operation.  A
13a0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
13b0: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
13c0: 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  n.  ** database 
13d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68 69 6c 65  connection while
13e0: 20 61 20 62 61 63 6b 75 70 20 69 73 20 69 6e 20   a backup is in 
13f0: 70 72 6f 67 72 65 73 73 20 6d 61 79 20 63 61 75  progress may cau
1400: 73 65 0a 20 20 2a 2a 20 61 20 6d 61 6c 66 75 6e  se.  ** a malfun
1410: 63 74 69 6f 6e 20 6f 72 20 61 20 64 65 61 64 6c  ction or a deadl
1420: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ock..  */.  sqli
1430: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1440: 70 53 72 63 44 62 2d 3e 6d 75 74 65 78 29 3b 0a  pSrcDb->mutex);.
1450: 0a 20 20 69 66 28 20 70 53 72 63 44 62 3d 3d 70  .  if( pSrcDb==p
1460: 44 65 73 74 44 62 20 29 7b 0a 20 20 20 20 73 71  DestDb ){.    sq
1470: 6c 69 74 65 33 45 72 72 6f 72 28 0a 20 20 20 20  lite3Error(.    
1480: 20 20 20 20 70 44 65 73 74 44 62 2c 20 53 51 4c      pDestDb, SQL
1490: 49 54 45 5f 45 52 52 4f 52 2c 20 22 53 6f 75 72  ITE_ERROR, "Sour
14a0: 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
14b0: 6f 6e 20 68 61 6e 64 6c 65 73 20 6d 75 73 74 20  on handles must 
14c0: 62 65 20 64 69 73 74 69 6e 63 74 22 0a 20 20 20  be distinct".   
14d0: 20 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   );.    p = 0;. 
14e0: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20   }else {.    /* 
14f0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1500: 6f 72 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33  or a new sqlite3
1510: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 20 2a  _backup object *
1520: 2f 0a 20 20 20 20 70 20 3d 20 28 73 71 6c 69 74  /.    p = (sqlit
1530: 65 33 5f 62 61 63 6b 75 70 20 2a 29 73 71 6c 69  e3_backup *)sqli
1540: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
1550: 66 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  f(sqlite3_backup
1560: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  ));.    if( !p )
1570: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1580: 72 72 6f 72 28 70 44 65 73 74 44 62 2c 20 53 51  rror(pDestDb, SQ
1590: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 30 29 3b 0a  LITE_NOMEM, 0);.
15a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15b0: 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  If the allocatio
15c0: 6e 20 73 75 63 63 65 65 64 65 64 2c 20 70 6f 70  n succeeded, pop
15d0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 6f 62  ulate the new ob
15e0: 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ject. */.  if( p
15f0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
1600: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1610: 74 65 33 5f 62 61 63 6b 75 70 29 29 3b 0a 20 20  te3_backup));.  
1620: 20 20 70 2d 3e 70 53 72 63 20 3d 20 66 69 6e 64    p->pSrc = find
1630: 42 74 72 65 65 28 70 44 65 73 74 44 62 2c 20 70  Btree(pDestDb, p
1640: 53 72 63 44 62 2c 20 7a 53 72 63 44 62 29 3b 0a  SrcDb, zSrcDb);.
1650: 20 20 20 20 70 2d 3e 70 44 65 73 74 20 3d 20 66      p->pDest = f
1660: 69 6e 64 42 74 72 65 65 28 70 44 65 73 74 44 62  indBtree(pDestDb
1670: 2c 20 70 44 65 73 74 44 62 2c 20 7a 44 65 73 74  , pDestDb, zDest
1680: 44 62 29 3b 0a 20 20 20 20 70 2d 3e 70 44 65 73  Db);.    p->pDes
1690: 74 44 62 20 3d 20 70 44 65 73 74 44 62 3b 0a 20  tDb = pDestDb;. 
16a0: 20 20 20 70 2d 3e 70 53 72 63 44 62 20 3d 20 70     p->pSrcDb = p
16b0: 53 72 63 44 62 3b 0a 20 20 20 20 70 2d 3e 69 4e  SrcDb;.    p->iN
16c0: 65 78 74 20 3d 20 31 3b 0a 0a 20 20 20 20 69 66  ext = 1;..    if
16d0: 28 20 30 3d 3d 70 2d 3e 70 53 72 63 20 7c 7c 20  ( 0==p->pSrc || 
16e0: 30 3d 3d 70 2d 3e 70 44 65 73 74 20 29 7b 0a 20  0==p->pDest ){. 
16f0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 28 6f 72 20       /* One (or 
1700: 62 6f 74 68 29 20 6f 66 20 74 68 65 20 6e 61 6d  both) of the nam
1710: 65 64 20 64 61 74 61 62 61 73 65 73 20 64 69 64  ed databases did
1720: 20 6e 6f 74 20 65 78 69 73 74 2e 20 41 6e 20 65   not exist. An e
1730: 72 72 6f 72 20 68 61 73 0a 20 20 20 20 20 20 2a  rror has.      *
1740: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
1750: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1760: 70 44 65 73 74 44 62 20 68 61 6e 64 6c 65 2e 20  pDestDb handle. 
1770: 41 6c 6c 20 74 68 61 74 20 69 73 20 6c 65 66 74  All that is left
1780: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  .      ** to do 
1790: 68 65 72 65 20 69 73 20 66 72 65 65 20 74 68 65  here is free the
17a0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
17b0: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 20  structure..     
17c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
17d0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
17e0: 20 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   p = 0;.    }.  
17f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79  }..  /* If every
1800: 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
1810: 73 20 70 6c 61 6e 6e 65 64 2c 20 61 74 74 61 63  s planned, attac
1820: 68 20 74 68 65 20 62 61 63 6b 75 70 20 6f 62 6a  h the backup obj
1830: 65 63 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ect to the.  ** 
1840: 73 6f 75 72 63 65 20 70 61 67 65 72 2e 20 54 68  source pager. Th
1850: 65 20 73 6f 75 72 63 65 20 70 61 67 65 72 20 63  e source pager c
1860: 61 6c 6c 73 20 42 61 63 6b 75 70 55 70 64 61 74  alls BackupUpdat
1870: 65 28 29 20 61 6e 64 20 42 61 63 6b 75 70 52 65  e() and BackupRe
1880: 73 74 61 72 74 28 29 0a 20 20 2a 2a 20 74 6f 20  start().  ** to 
1890: 6e 6f 74 69 66 79 20 74 68 69 73 20 6d 6f 64 75  notify this modu
18a0: 6c 65 20 69 66 20 74 68 65 20 73 6f 75 72 63 65  le if the source
18b0: 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66 69 65   file is modifie
18c0: 64 20 6d 69 64 2d 62 61 63 6b 75 70 2e 0a 20 20  d mid-backup..  
18d0: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
18e0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
18f0: 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
1900: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1910: 20 68 65 61 64 20 6f 66 20 70 61 67 65 72 73 20   head of pagers 
1920: 62 61 63 6b 75 70 20 6c 69 73 74 20 2a 2f 0a 20  backup list */. 
1930: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1940: 6e 74 65 72 28 70 2d 3e 70 53 72 63 29 3b 0a 20  nter(p->pSrc);. 
1950: 20 20 20 70 70 20 3d 20 73 71 6c 69 74 65 33 50     pp = sqlite3P
1960: 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 73 71  agerBackupPtr(sq
1970: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1980: 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 20 20 70  p->pSrc));.    p
1990: 2d 3e 70 4e 65 78 74 20 3d 20 2a 70 70 3b 0a 20  ->pNext = *pp;. 
19a0: 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20     *pp = p;.    
19b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19c0: 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  e(p->pSrc);.    
19d0: 70 2d 3e 70 53 72 63 2d 3e 6e 42 61 63 6b 75 70  p->pSrc->nBackup
19e0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  ++;.  }..  sqlit
19f0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1a00: 53 72 63 44 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  SrcDb->mutex);. 
1a10: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a20: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 53  .** Parameter zS
1a30: 72 63 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f  rcData points to
1a40: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1a50: 6e 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 6f  ning the data fo
1a60: 72 20 0a 2a 2a 20 70 61 67 65 20 69 53 72 63 50  r .** page iSrcP
1a70: 67 20 66 72 6f 6d 20 74 68 65 20 73 6f 75 72 63  g from the sourc
1a80: 65 20 64 61 74 61 62 61 73 65 2e 20 43 6f 70 79  e database. Copy
1a90: 20 74 68 69 73 20 64 61 74 61 20 69 6e 74 6f 20   this data into 
1aa0: 74 68 65 20 0a 2a 2a 20 64 65 73 74 69 6e 61 74  the .** destinat
1ab0: 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ion database..*/
1ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b  .static int back
1ad0: 75 70 4f 6e 65 50 61 67 65 28 73 71 6c 69 74 65  upOnePage(sqlite
1ae0: 33 5f 62 61 63 6b 75 70 20 2a 70 2c 20 50 67 6e  3_backup *p, Pgn
1af0: 6f 20 69 53 72 63 50 67 2c 20 63 6f 6e 73 74 20  o iSrcPg, const 
1b00: 75 38 20 2a 7a 53 72 63 44 61 74 61 29 7b 0a 20  u8 *zSrcData){. 
1b10: 20 50 61 67 65 72 20 2a 20 63 6f 6e 73 74 20 70   Pager * const p
1b20: 44 65 73 74 50 61 67 65 72 20 3d 20 73 71 6c 69  DestPager = sqli
1b30: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 2d  te3BtreePager(p-
1b40: 3e 70 44 65 73 74 29 3b 0a 20 20 63 6f 6e 73 74  >pDest);.  const
1b50: 20 69 6e 74 20 6e 53 72 63 50 67 73 7a 20 3d 20   int nSrcPgsz = 
1b60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1b70: 61 67 65 53 69 7a 65 28 70 2d 3e 70 53 72 63 29  ageSize(p->pSrc)
1b80: 3b 0a 20 20 69 6e 74 20 6e 44 65 73 74 50 67 73  ;.  int nDestPgs
1b90: 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  z = sqlite3Btree
1ba0: 47 65 74 50 61 67 65 53 69 7a 65 28 70 2d 3e 70  GetPageSize(p->p
1bb0: 44 65 73 74 29 3b 0a 20 20 63 6f 6e 73 74 20 69  Dest);.  const i
1bc0: 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 6e  nt nCopy = MIN(n
1bd0: 53 72 63 50 67 73 7a 2c 20 6e 44 65 73 74 50 67  SrcPgsz, nDestPg
1be0: 73 7a 29 3b 0a 20 20 63 6f 6e 73 74 20 69 36 34  sz);.  const i64
1bf0: 20 69 45 6e 64 20 3d 20 28 69 36 34 29 69 53 72   iEnd = (i64)iSr
1c00: 63 50 67 2a 28 69 36 34 29 6e 53 72 63 50 67 73  cPg*(i64)nSrcPgs
1c10: 7a 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  z;..  int rc = S
1c20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 36 34 20  QLITE_OK;.  i64 
1c30: 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28  iOff;..  assert(
1c40: 20 70 2d 3e 62 44 65 73 74 4c 6f 63 6b 65 64 20   p->bDestLocked 
1c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1c60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1c70: 0a 20 20 61 73 73 65 72 74 28 20 69 53 72 63 50  .  assert( iSrcP
1c80: 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1c90: 50 41 47 45 28 70 2d 3e 70 53 72 63 2d 3e 70 42  PAGE(p->pSrc->pB
1ca0: 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
1cb0: 7a 53 72 63 44 61 74 61 20 29 3b 0a 0a 20 20 2f  zSrcData );..  /
1cc0: 2a 20 43 61 74 63 68 20 74 68 65 20 63 61 73 65  * Catch the case
1cd0: 20 77 68 65 72 65 20 74 68 65 20 64 65 73 74 69   where the desti
1ce0: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d  nation is an in-
1cf0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1d00: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  and the.  ** pag
1d10: 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 73  e sizes of the s
1d20: 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e  ource and destin
1d30: 61 74 69 6f 6e 20 64 69 66 66 65 72 2e 20 0a 20  ation differ. . 
1d40: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 72 63 50 67   */.  if( nSrcPg
1d50: 73 7a 21 3d 6e 44 65 73 74 50 67 73 7a 20 26 26  sz!=nDestPgsz &&
1d60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
1d70: 65 6d 64 62 28 73 71 6c 69 74 65 33 42 74 72 65  emdb(sqlite3Btre
1d80: 65 50 61 67 65 72 28 70 2d 3e 70 44 65 73 74 29  ePager(p->pDest)
1d90: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
1da0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1db0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f   }..  /* This lo
1dc0: 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1dd0: 20 65 61 63 68 20 64 65 73 74 69 6e 61 74 69 6f   each destinatio
1de0: 6e 20 70 61 67 65 20 73 70 61 6e 6e 65 64 20 62  n page spanned b
1df0: 79 20 74 68 65 20 73 6f 75 72 63 65 20 0a 20 20  y the source .  
1e00: 2a 2a 20 70 61 67 65 2e 20 46 6f 72 20 65 61 63  ** page. For eac
1e10: 68 20 69 74 65 72 61 74 69 6f 6e 2c 20 76 61 72  h iteration, var
1e20: 69 61 62 6c 65 20 69 4f 66 66 20 69 73 20 73 65  iable iOff is se
1e30: 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66  t to the byte of
1e40: 66 73 65 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  fset.  ** of the
1e50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 67   destination pag
1e60: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 4f  e..  */.  for(iO
1e70: 66 66 3d 69 45 6e 64 2d 28 69 36 34 29 6e 53 72  ff=iEnd-(i64)nSr
1e80: 63 50 67 73 7a 3b 20 72 63 3d 3d 53 51 4c 49 54  cPgsz; rc==SQLIT
1e90: 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 45 6e  E_OK && iOff<iEn
1ea0: 64 3b 20 69 4f 66 66 2b 3d 6e 44 65 73 74 50 67  d; iOff+=nDestPg
1eb0: 73 7a 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  sz){.    DbPage 
1ec0: 2a 70 44 65 73 74 50 67 20 3d 20 30 3b 0a 20 20  *pDestPg = 0;.  
1ed0: 20 20 50 67 6e 6f 20 69 44 65 73 74 20 3d 20 28    Pgno iDest = (
1ee0: 50 67 6e 6f 29 28 69 4f 66 66 2f 6e 44 65 73 74  Pgno)(iOff/nDest
1ef0: 50 67 73 7a 29 2b 31 3b 0a 20 20 20 20 69 66 28  Pgsz)+1;.    if(
1f00: 20 69 44 65 73 74 3d 3d 50 45 4e 44 49 4e 47 5f   iDest==PENDING_
1f10: 42 59 54 45 5f 50 41 47 45 28 70 2d 3e 70 44 65  BYTE_PAGE(p->pDe
1f20: 73 74 2d 3e 70 42 74 29 20 29 20 63 6f 6e 74 69  st->pBt) ) conti
1f30: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  nue;.    if( SQL
1f40: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
1f50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 44  lite3PagerGet(pD
1f60: 65 73 74 50 61 67 65 72 2c 20 69 44 65 73 74 2c  estPager, iDest,
1f70: 20 26 70 44 65 73 74 50 67 29 29 0a 20 20 20 20   &pDestPg)).    
1f80: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fa0: 72 57 72 69 74 65 28 70 44 65 73 74 50 67 29 29  rWrite(pDestPg))
1fb0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
1fc0: 6e 73 74 20 75 38 20 2a 7a 49 6e 20 3d 20 26 7a  nst u8 *zIn = &z
1fd0: 53 72 63 44 61 74 61 5b 69 4f 66 66 25 6e 53 72  SrcData[iOff%nSr
1fe0: 63 50 67 73 7a 5d 3b 0a 20 20 20 20 20 20 75 38  cPgsz];.      u8
1ff0: 20 2a 7a 44 65 73 74 44 61 74 61 20 3d 20 73 71   *zDestData = sq
2000: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
2010: 61 28 70 44 65 73 74 50 67 29 3b 0a 20 20 20 20  a(pDestPg);.    
2020: 20 20 75 38 20 2a 7a 4f 75 74 20 3d 20 26 7a 44    u8 *zOut = &zD
2030: 65 73 74 44 61 74 61 5b 69 4f 66 66 25 6e 44 65  estData[iOff%nDe
2040: 73 74 50 67 73 7a 5d 3b 0a 0a 20 20 20 20 20 20  stPgsz];..      
2050: 2f 2a 20 43 6f 70 79 20 74 68 65 20 64 61 74 61  /* Copy the data
2060: 20 66 72 6f 6d 20 74 68 65 20 73 6f 75 72 63 65   from the source
2070: 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 64   page into the d
2080: 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 67 65 2e  estination page.
2090: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
20a0: 6c 65 61 72 20 74 68 65 20 42 74 72 65 65 20 6c  lear the Btree l
20b0: 61 79 65 72 20 4d 65 6d 50 61 67 65 2e 69 73 49  ayer MemPage.isI
20c0: 6e 69 74 20 66 6c 61 67 2e 20 42 6f 74 68 20 74  nit flag. Both t
20d0: 68 69 73 20 6d 6f 64 75 6c 65 0a 20 20 20 20 20  his module.     
20e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 70 61 67 65   ** and the page
20f0: 72 20 63 6f 64 65 20 75 73 65 20 74 68 69 73 20  r code use this 
2100: 74 72 69 63 6b 20 28 63 6c 65 61 72 69 6e 67 20  trick (clearing 
2110: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
2120: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70       ** of the p
2130: 61 67 65 20 27 65 78 74 72 61 27 20 73 70 61 63  age 'extra' spac
2140: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
2150: 74 68 65 20 42 74 72 65 65 20 6c 61 79 65 72 73  the Btree layers
2160: 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 64  .      ** cached
2170: 20 70 61 72 73 65 20 6f 66 20 74 68 65 20 70 61   parse of the pa
2180: 67 65 29 2e 20 4d 65 6d 50 61 67 65 2e 69 73 49  ge). MemPage.isI
2190: 6e 69 74 20 69 73 20 6d 61 72 6b 65 64 20 0a 20  nit is marked . 
21a0: 20 20 20 20 20 2a 2a 20 22 4d 55 53 54 20 42 45       ** "MUST BE
21b0: 20 46 49 52 53 54 22 20 66 6f 72 20 74 68 69 73   FIRST" for this
21c0: 20 70 75 72 70 6f 73 65 2e 0a 20 20 20 20 20 20   purpose..      
21d0: 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  */.      memcpy(
21e0: 7a 4f 75 74 2c 20 7a 49 6e 2c 20 6e 43 6f 70 79  zOut, zIn, nCopy
21f0: 29 3b 0a 20 20 20 20 20 20 28 28 75 38 20 2a 29  );.      ((u8 *)
2200: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2210: 78 74 72 61 28 70 44 65 73 74 50 67 29 29 5b 30  xtra(pDestPg))[0
2220: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
2230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2240: 65 66 28 70 44 65 73 74 50 67 29 3b 0a 20 20 7d  ef(pDestPg);.  }
2250: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2260: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 6e 50 61  ../*.** Copy nPa
2270: 67 65 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ge pages from th
2280: 65 20 73 6f 75 72 63 65 20 62 2d 74 72 65 65 20  e source b-tree 
2290: 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  to the destinati
22a0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
22b0: 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 73  e3_backup_step(s
22c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
22d0: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
22e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74  int rc;..  sqlit
22f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2300: 2d 3e 70 53 72 63 44 62 2d 3e 6d 75 74 65 78 29  ->pSrcDb->mutex)
2310: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2320: 45 6e 74 65 72 28 70 2d 3e 70 53 72 63 29 3b 0a  Enter(p->pSrc);.
2330: 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62    if( p->pDestDb
2340: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2350: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70  mutex_enter(p->p
2360: 44 65 73 74 44 62 2d 3e 6d 75 74 65 78 29 3b 0a  DestDb->mutex);.
2370: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 2d 3e 72    }..  rc = p->r
2380: 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  c;.  if( rc==SQL
2390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 61  ITE_OK ){.    Pa
23a0: 67 65 72 20 2a 20 63 6f 6e 73 74 20 70 53 72 63  ger * const pSrc
23b0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
23c0: 74 72 65 65 50 61 67 65 72 28 70 2d 3e 70 53 72  treePager(p->pSr
23d0: 63 29 3b 20 20 20 20 20 2f 2a 20 53 6f 75 72 63  c);     /* Sourc
23e0: 65 20 70 61 67 65 72 20 2a 2f 0a 20 20 20 20 50  e pager */.    P
23f0: 61 67 65 72 20 2a 20 63 6f 6e 73 74 20 70 44 65  ager * const pDe
2400: 73 74 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  stPager = sqlite
2410: 33 42 74 72 65 65 50 61 67 65 72 28 70 2d 3e 70  3BtreePager(p->p
2420: 44 65 73 74 29 3b 20 20 20 2f 2a 20 44 65 73 74  Dest);   /* Dest
2430: 20 70 61 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e   pager */.    in
2440: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2470: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
2480: 20 6e 53 72 63 50 61 67 65 20 3d 20 2d 31 3b 20   nSrcPage = -1; 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 73 6f 75 72 63  /* Size of sourc
24b0: 65 20 64 62 20 69 6e 20 70 61 67 65 73 20 2a 2f  e db in pages */
24c0: 0a 20 20 20 20 69 6e 74 20 62 43 6c 6f 73 65 54  .    int bCloseT
24d0: 72 61 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20  rans = 0;       
24e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24f0: 69 66 20 73 72 63 20 64 62 20 72 65 71 75 69 72  if src db requir
2500: 65 73 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  es unlocking */.
2510: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2520: 6f 75 72 63 65 20 70 61 67 65 72 20 69 73 20 63  ource pager is c
2530: 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 77 72  urrently in a wr
2540: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
2550: 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
2560: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 6d 6d  QLITE_LOCKED imm
2570: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f  ediately..    */
2580: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 44 65 73  .    if( p->pDes
2590: 74 44 62 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  tDb && p->pSrc->
25a0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25b0: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
25c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25d0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
25e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20   }..    /* Lock 
25f0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
2600: 64 61 74 61 62 61 73 65 2c 20 69 66 20 69 74 20  database, if it 
2610: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61 6c  is not locked al
2620: 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ready. */.    if
2630: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
2640: 26 26 20 70 2d 3e 62 44 65 73 74 4c 6f 63 6b 65  && p->bDestLocke
2650: 64 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 51 4c  d==0.     && SQL
2660: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
2670: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
2680: 72 61 6e 73 28 70 2d 3e 70 44 65 73 74 2c 20 32  rans(p->pDest, 2
2690: 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  )) .    ){.     
26a0: 20 70 2d 3e 62 44 65 73 74 4c 6f 63 6b 65 64 20   p->bDestLocked 
26b0: 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
26c0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
26d0: 65 74 61 28 70 2d 3e 70 44 65 73 74 2c 20 31 2c  eta(p->pDest, 1,
26e0: 20 26 70 2d 3e 69 44 65 73 74 53 63 68 65 6d 61   &p->iDestSchema
26f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2700: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2710: 6f 70 65 6e 20 72 65 61 64 2d 74 72 61 6e 73 61  open read-transa
2720: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6f 75  ction on the sou
2730: 72 63 65 20 64 61 74 61 62 61 73 65 2c 20 6f 70  rce database, op
2740: 65 6e 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 6e 6f  en.    ** one no
2750: 77 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  w. If a transact
2760: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 68 65  ion is opened he
2770: 72 65 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  re, then it will
2780: 20 62 65 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a   be closed.    *
2790: 2a 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  * before this fu
27a0: 6e 63 74 69 6f 6e 20 65 78 69 74 73 2e 0a 20 20  nction exits..  
27b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
27c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
27d0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
27e0: 6e 52 65 61 64 54 72 61 6e 73 28 70 2d 3e 70 53  nReadTrans(p->pS
27f0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rc) ){.      rc 
2800: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
2810: 67 69 6e 54 72 61 6e 73 28 70 2d 3e 70 53 72 63  ginTrans(p->pSrc
2820: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 43 6c 6f  , 0);.      bClo
2830: 73 65 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  seTrans = 1;.   
2840: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77   }.  .    /* Now
2850: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
2860: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
2870: 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  e source databas
2880: 65 2c 20 71 75 65 72 79 20 74 68 65 0a 20 20 20  e, query the.   
2890: 20 2a 2a 20 73 6f 75 72 63 65 20 70 61 67 65 72   ** source pager
28a0: 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
28b0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
28c0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
28d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2900: 72 50 61 67 65 63 6f 75 6e 74 28 70 53 72 63 50  rPagecount(pSrcP
2910: 61 67 65 72 2c 20 26 6e 53 72 63 50 61 67 65 29  ager, &nSrcPage)
2920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2930: 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
2940: 26 20 70 2d 3e 69 4e 65 78 74 3c 3d 28 50 67 6e  & p->iNext<=(Pgn
2950: 6f 29 6e 53 72 63 50 61 67 65 20 26 26 20 72 63  o)nSrcPage && rc
2960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
2970: 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
2980: 50 67 6e 6f 20 69 53 72 63 50 67 20 3d 20 70 2d  Pgno iSrcPg = p-
2990: 3e 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  >iNext;         
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
29b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  e page number */
29c0: 0a 20 20 20 20 20 20 69 66 28 20 69 53 72 63 50  .      if( iSrcP
29d0: 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
29e0: 50 41 47 45 28 70 2d 3e 70 53 72 63 2d 3e 70 42  PAGE(p->pSrc->pB
29f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62  t) ){.        Db
2a00: 50 61 67 65 20 2a 70 53 72 63 50 67 3b 20 20 20  Page *pSrcPg;   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
2a30: 72 63 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  rce page object 
2a40: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2a50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2a60: 70 53 72 63 50 61 67 65 72 2c 20 69 53 72 63 50  pSrcPager, iSrcP
2a70: 67 2c 20 26 70 53 72 63 50 67 29 3b 0a 20 20 20  g, &pSrcPg);.   
2a80: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2aa0: 20 20 20 20 72 63 20 3d 20 62 61 63 6b 75 70 4f      rc = backupO
2ab0: 6e 65 50 61 67 65 28 70 2c 20 69 53 72 63 50 67  nePage(p, iSrcPg
2ac0: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  , sqlite3PagerGe
2ad0: 74 44 61 74 61 28 70 53 72 63 50 67 29 29 3b 0a  tData(pSrcPg));.
2ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2af0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 53 72 63  3PagerUnref(pSrc
2b00: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pg);.        }. 
2b10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
2b20: 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  iNext++;.    }. 
2b30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
2b50: 3e 6e 50 61 67 65 63 6f 75 6e 74 20 3d 20 6e 53  >nPagecount = nS
2b60: 72 63 50 61 67 65 3b 0a 20 20 20 20 20 20 70 2d  rcPage;.      p-
2b70: 3e 6e 52 65 6d 61 69 6e 69 6e 67 20 3d 20 6e 53  >nRemaining = nS
2b80: 72 63 50 61 67 65 2b 31 2d 70 2d 3e 69 4e 65 78  rcPage+1-p->iNex
2b90: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
2ba0: 69 4e 65 78 74 3e 28 50 67 6e 6f 29 6e 53 72 63  iNext>(Pgno)nSrc
2bb0: 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2bc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
2bd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2be0: 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53    .    if( rc==S
2bf0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2c00: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53      const int nS
2c10: 72 63 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c  rcPagesize = sql
2c20: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2c30: 53 69 7a 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20  Size(p->pSrc);. 
2c40: 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
2c50: 44 65 73 74 50 61 67 65 73 69 7a 65 20 3d 20 73  DestPagesize = s
2c60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2c70: 67 65 53 69 7a 65 28 70 2d 3e 70 44 65 73 74 29  geSize(p->pDest)
2c80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 65 73  ;.      int nDes
2c90: 74 54 72 75 6e 63 61 74 65 3b 0a 20 20 20 20 20  tTruncate;.     
2ca0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2cb0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  File = 0;.      
2cc0: 69 36 34 20 69 53 69 7a 65 3b 0a 20 20 0a 20 20  i64 iSize;.  .  
2cd0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2ce0: 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
2cf0: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 64 65   field in the de
2d00: 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61  stination databa
2d10: 73 65 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  se. This.      *
2d20: 2a 20 69 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  * is to make sur
2d30: 65 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  e that the schem
2d40: 61 2d 76 65 72 73 69 6f 6e 20 72 65 61 6c 6c 79  a-version really
2d50: 20 64 6f 65 73 20 63 68 61 6e 67 65 20 69 6e 0a   does change in.
2d60: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 73        ** the cas
2d70: 65 20 77 68 65 72 65 20 74 68 65 20 73 6f 75 72  e where the sour
2d80: 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
2d90: 6f 6e 20 64 61 74 61 62 61 73 65 73 20 68 61 76  on databases hav
2da0: 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
2db0: 61 6d 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  ame schema versi
2dc0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2dd0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
2de0: 70 64 61 74 65 4d 65 74 61 28 70 2d 3e 70 44 65  pdateMeta(p->pDe
2df0: 73 74 2c 20 31 2c 20 70 2d 3e 69 44 65 73 74 53  st, 1, p->iDestS
2e00: 63 68 65 6d 61 2b 31 29 3b 0a 20 20 20 20 20 20  chema+1);.      
2e10: 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29  if( p->pDestDb )
2e20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e30: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
2e40: 68 65 6d 61 28 70 2d 3e 70 44 65 73 74 44 62 2c  hema(p->pDestDb,
2e50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
2e60: 20 20 20 20 2f 2a 20 53 65 74 20 6e 44 65 73 74      /* Set nDest
2e70: 54 72 75 6e 63 61 74 65 20 74 6f 20 74 68 65 20  Truncate to the 
2e80: 66 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  final number of 
2e90: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 65 73  pages in the des
2ea0: 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
2eb0: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
2ec0: 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 68 65 72  complication her
2ed0: 65 20 69 73 20 74 68 61 74 20 74 68 65 20 64 65  e is that the de
2ee0: 73 74 69 6e 61 74 69 6f 6e 20 70 61 67 65 0a 20  stination page. 
2ef0: 20 20 20 20 20 2a 2a 20 73 69 7a 65 20 6d 61 79       ** size may
2f00: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f   be different to
2f10: 20 74 68 65 20 73 6f 75 72 63 65 20 70 61 67 65   the source page
2f20: 20 73 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2a   size. .      **
2f30: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
2f40: 20 73 6f 75 72 63 65 20 70 61 67 65 20 73 69 7a   source page siz
2f50: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
2f60: 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
2f70: 6e 20 70 61 67 65 20 73 69 7a 65 2c 20 0a 20 20  n page size, .  
2f80: 20 20 20 20 2a 2a 20 72 6f 75 6e 64 20 75 70 2e      ** round up.
2f90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2fa0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
2fb0: 33 4f 73 54 72 75 6e 63 61 74 65 28 29 20 62 65  3OsTruncate() be
2fc0: 6c 6f 77 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  low will.      *
2fd0: 2a 20 66 69 78 20 74 68 65 20 73 69 7a 65 20 6f  * fix the size o
2fe0: 66 20 74 68 65 20 66 69 6c 65 2e 20 48 6f 77 65  f the file. Howe
2ff0: 76 65 72 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ver it is import
3000: 61 6e 74 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20  ant to call.    
3010: 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
3020: 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
3030: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 61 6e   here so that an
3040: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 0a  y pages in the .
3050: 20 20 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61        ** destina
3060: 74 69 6f 6e 20 66 69 6c 65 20 74 68 61 74 20 6c  tion file that l
3070: 69 65 20 62 65 79 6f 6e 64 20 74 68 65 20 6e 44  ie beyond the nD
3080: 65 73 74 54 72 75 6e 63 61 74 65 20 70 61 67 65  estTruncate page
3090: 20 6d 61 72 6b 20 61 72 65 0a 20 20 20 20 20 20   mark are.      
30a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79  ** journalled by
30b0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
30c0: 65 4f 6e 65 28 29 20 62 65 66 6f 72 65 20 74 68  eOne() before th
30d0: 65 79 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ey are destroyed
30e0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65  .      ** by the
30f0: 20 66 69 6c 65 20 74 72 75 6e 63 61 74 69 6f 6e   file truncation
3100: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
3110: 20 69 66 28 20 6e 53 72 63 50 61 67 65 73 69 7a   if( nSrcPagesiz
3120: 65 3c 6e 44 65 73 74 50 61 67 65 73 69 7a 65 20  e<nDestPagesize 
3130: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
3140: 61 74 69 6f 20 3d 20 6e 44 65 73 74 50 61 67 65  atio = nDestPage
3150: 73 69 7a 65 2f 6e 53 72 63 50 61 67 65 73 69 7a  size/nSrcPagesiz
3160: 65 3b 0a 20 20 20 20 20 20 20 20 6e 44 65 73 74  e;.        nDest
3170: 54 72 75 6e 63 61 74 65 20 3d 20 28 6e 53 72 63  Truncate = (nSrc
3180: 50 61 67 65 2b 72 61 74 69 6f 2d 31 29 2f 72 61  Page+ratio-1)/ra
3190: 74 69 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tio;.      }else
31a0: 7b 0a 20 20 20 20 20 20 20 20 6e 44 65 73 74 54  {.        nDestT
31b0: 72 75 6e 63 61 74 65 20 3d 20 6e 53 72 63 50 61  runcate = nSrcPa
31c0: 67 65 20 2a 20 28 6e 53 72 63 50 61 67 65 73 69  ge * (nSrcPagesi
31d0: 7a 65 2f 6e 44 65 73 74 50 61 67 65 73 69 7a 65  ze/nDestPagesize
31e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
3200: 6e 63 61 74 65 49 6d 61 67 65 28 70 44 65 73 74  ncateImage(pDest
3210: 50 61 67 65 72 2c 20 6e 44 65 73 74 54 72 75 6e  Pager, nDestTrun
3220: 63 61 74 65 29 3b 0a 0a 20 20 20 20 20 20 69 66  cate);..      if
3230: 28 20 6e 53 72 63 50 61 67 65 73 69 7a 65 3c 6e  ( nSrcPagesize<n
3240: 44 65 73 74 50 61 67 65 73 69 7a 65 20 29 7b 0a  DestPagesize ){.
3250: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3260: 65 20 73 6f 75 72 63 65 20 70 61 67 65 2d 73 69  e source page-si
3270: 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ze is smaller th
3280: 61 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  an the destinati
3290: 6f 6e 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20  on page-size,.  
32a0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 65 78 74        ** two ext
32b0: 72 61 20 74 68 69 6e 67 73 20 6d 61 79 20 6e 65  ra things may ne
32c0: 65 64 20 74 6f 20 68 61 70 70 65 6e 3a 0a 20 20  ed to happen:.  
32d0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32e0: 20 2a 2a 20 20 20 2a 20 54 68 65 20 64 65 73 74   **   * The dest
32f0: 69 6e 61 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64  ination may need
3300: 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
3310: 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
3320: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2a 20  .        **   * 
3330: 44 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 74  Data stored on t
3340: 68 65 20 70 61 67 65 73 20 69 6d 6d 65 64 69 61  he pages immedia
3350: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
3360: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  he .        **  
3370: 20 20 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20     pending-byte 
3380: 70 61 67 65 20 69 6e 20 74 68 65 20 73 6f 75 72  page in the sour
3390: 63 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  ce database may 
33a0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 20  need to be.     
33b0: 20 20 20 2a 2a 20 20 20 20 20 63 6f 70 69 65 64     **     copied
33c0: 20 69 6e 74 6f 20 74 68 65 20 64 65 73 74 69 6e   into the destin
33d0: 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 2e 0a  ation database..
33e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33f0: 20 20 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29     iSize = (i64)
3400: 6e 53 72 63 50 61 67 65 73 69 7a 65 20 2a 20 28  nSrcPagesize * (
3410: 69 36 34 29 6e 53 72 63 50 61 67 65 3b 0a 20 20  i64)nSrcPage;.  
3420: 20 20 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71        pFile = sq
3430: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
3440: 44 65 73 74 50 61 67 65 72 29 3b 0a 20 20 20 20  DestPager);.    
3450: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
3460: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
3470: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
3480: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
3490: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 44 65  mmitPhaseOne(pDe
34a0: 73 74 50 61 67 65 72 2c 20 30 2c 20 31 29 29 0a  stPager, 0, 1)).
34b0: 20 20 20 20 20 20 20 20 20 26 26 20 53 51 4c 49           && SQLI
34c0: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
34d0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
34e0: 46 69 6c 65 2c 20 69 53 69 7a 65 29 29 0a 20 20  File, iSize)).  
34f0: 20 20 20 20 20 20 20 26 26 20 53 51 4c 49 54 45         && SQLITE
3500: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
3510: 65 33 50 61 67 65 72 53 79 6e 63 28 70 44 65 73  e3PagerSync(pDes
3520: 74 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  tPager)).       
3530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
3540: 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  4 iOff;.        
3550: 20 20 69 36 34 20 69 45 6e 64 20 3d 20 4d 49 4e    i64 iEnd = MIN
3560: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 2b 20  (PENDING_BYTE + 
3570: 6e 44 65 73 74 50 61 67 65 73 69 7a 65 2c 20 69  nDestPagesize, i
3580: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
3590: 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20   for(.          
35a0: 20 20 69 4f 66 66 3d 50 45 4e 44 49 4e 47 5f 42    iOff=PENDING_B
35b0: 59 54 45 2b 6e 53 72 63 50 61 67 65 73 69 7a 65  YTE+nSrcPagesize
35c0: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ; .            r
35d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35e0: 69 4f 66 66 3c 69 45 6e 64 3b 20 0a 20 20 20 20  iOff<iEnd; .    
35f0: 20 20 20 20 20 20 20 20 69 4f 66 66 2b 3d 6e 53          iOff+=nS
3600: 72 63 50 61 67 65 73 69 7a 65 0a 20 20 20 20 20  rcPagesize.     
3610: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3620: 20 20 20 20 50 67 48 64 72 20 2a 70 53 72 63 50      PgHdr *pSrcP
3630: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
3640: 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53     const Pgno iS
3650: 72 63 50 67 20 3d 20 28 50 67 6e 6f 29 28 28 69  rcPg = (Pgno)((i
3660: 4f 66 66 2f 6e 53 72 63 50 61 67 65 73 69 7a 65  Off/nSrcPagesize
3670: 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+1);.          
3680: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3690: 67 65 72 47 65 74 28 70 53 72 63 50 61 67 65 72  gerGet(pSrcPager
36a0: 2c 20 69 53 72 63 50 67 2c 20 26 70 53 72 63 50  , iSrcPg, &pSrcP
36b0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
36c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
36e0: 20 20 20 75 38 20 2a 7a 44 61 74 61 20 3d 20 73     u8 *zData = s
36f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
3700: 74 61 28 70 53 72 63 50 67 29 3b 0a 20 20 20 20  ta(pSrcPg);.    
3710: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
3720: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 46  qlite3OsWrite(pF
3730: 69 6c 65 2c 20 7a 44 61 74 61 2c 20 6e 53 72 63  ile, zData, nSrc
3740: 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29 3b  Pagesize, iOff);
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3760: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
3770: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 53 72  e3PagerUnref(pSr
3780: 63 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cPg);.          
3790: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37c0: 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
37d0: 28 70 44 65 73 74 50 61 67 65 72 2c 20 30 2c 20  (pDestPager, 0, 
37e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  0);.      }.  . 
37f0: 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 63       /* Finish c
3800: 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72  ommitting the tr
3810: 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ansaction to the
3820: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74   destination dat
3830: 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  abase. */.      
3840: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
3850: 63 0a 20 20 20 20 20 20 20 26 26 20 53 51 4c 49  c.       && SQLI
3860: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
3870: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
3880: 68 61 73 65 54 77 6f 28 70 2d 3e 70 44 65 73 74  haseTwo(p->pDest
3890: 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
38a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
38b0: 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
38c0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
38d0: 20 62 43 6c 6f 73 65 54 72 61 6e 73 20 69 73 20   bCloseTrans is 
38e0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20  true, then this 
38f0: 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  function opened 
3900: 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
3910: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  on.    ** on the
3920: 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
3930: 2e 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  . Close the read
3940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 65 72   transaction her
3950: 65 2e 20 54 68 65 72 65 20 69 73 0a 20 20 20 20  e. There is.    
3960: 2a 2a 20 6e 6f 20 6e 65 65 64 20 74 6f 20 63 68  ** no need to ch
3970: 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
3980: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 62 74 72  alues of the btr
3990: 65 65 20 6d 65 74 68 6f 64 73 20 68 65 72 65 2c  ee methods here,
39a0: 20 61 73 0a 20 20 20 20 2a 2a 20 22 63 6f 6d 6d   as.    ** "comm
39b0: 69 74 74 69 6e 67 22 20 61 20 72 65 61 64 2d 6f  itting" a read-o
39c0: 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
39d0: 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 0a 20 20 20  cannot fail..   
39e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 6c 6f   */.    if( bClo
39f0: 73 65 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  seTrans ){.     
3a00: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 72   TESTONLY( int r
3a10: 63 32 20 29 3b 0a 20 20 20 20 20 20 54 45 53 54  c2 );.      TEST
3a20: 4f 4e 4c 59 28 20 72 63 32 20 20 3d 20 29 20 73  ONLY( rc2  = ) s
3a30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
3a40: 74 50 68 61 73 65 4f 6e 65 28 70 2d 3e 70 53 72  tPhaseOne(p->pSr
3a50: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45 53  c, 0);.      TES
3a60: 54 4f 4e 4c 59 28 20 72 63 32 20 7c 3d 20 29 20  TONLY( rc2 |= ) 
3a70: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
3a80: 69 74 50 68 61 73 65 54 77 6f 28 70 2d 3e 70 53  itPhaseTwo(p->pS
3a90: 72 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rc);.      asser
3aa0: 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
3ab0: 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  K );.    }.  .  
3ac0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3ad0: 5f 4c 4f 43 4b 45 44 20 26 26 20 72 63 21 3d 53  _LOCKED && rc!=S
3ae0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
3af0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
3b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3b10: 70 2d 3e 70 44 65 73 74 44 62 20 29 7b 0a 20 20  p->pDestDb ){.  
3b20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3b30: 6c 65 61 76 65 28 70 2d 3e 70 44 65 73 74 44 62  leave(p->pDestDb
3b40: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
3b50: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
3b60: 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71  e(p->pSrc);.  sq
3b70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
3b80: 65 28 70 2d 3e 70 53 72 63 44 62 2d 3e 6d 75 74  e(p->pSrcDb->mut
3b90: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
3ba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
3bb0: 73 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  se all resources
3bc0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3bd0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   an sqlite3_back
3be0: 75 70 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  up* handle..*/.i
3bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nt sqlite3_backu
3c00: 70 5f 66 69 6e 69 73 68 28 73 71 6c 69 74 65 33  p_finish(sqlite3
3c10: 5f 62 61 63 6b 75 70 20 2a 70 29 7b 0a 20 20 73  _backup *p){.  s
3c20: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a  qlite3_backup **
3c30: 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
3c40: 20 20 20 20 2f 2a 20 50 74 72 20 74 6f 20 68 65      /* Ptr to he
3c50: 61 64 20 6f 66 20 70 61 67 65 72 73 20 62 61 63  ad of pagers bac
3c60: 6b 75 70 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  kup list */.  sq
3c70: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
3c80: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
3c90: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70     /* Mutex to p
3ca0: 72 6f 74 65 63 74 20 73 6f 75 72 63 65 20 64 61  rotect source da
3cb0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
3cc0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
3cf0: 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 45 6e 74  urn */..  /* Ent
3d00: 65 72 20 74 68 65 20 6d 75 74 65 78 65 73 20 2a  er the mutexes *
3d10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
3d20: 78 5f 65 6e 74 65 72 28 70 2d 3e 70 53 72 63 44  x_enter(p->pSrcD
3d30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
3d40: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
3d50: 2d 3e 70 53 72 63 29 3b 0a 20 20 6d 75 74 65 78  ->pSrc);.  mutex
3d60: 20 3d 20 70 2d 3e 70 53 72 63 44 62 2d 3e 6d 75   = p->pSrcDb->mu
3d70: 74 65 78 3b 0a 20 20 69 66 28 20 70 2d 3e 70 44  tex;.  if( p->pD
3d80: 65 73 74 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  estDb ){.    sql
3d90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3da0: 28 70 2d 3e 70 44 65 73 74 44 62 2d 3e 6d 75 74  (p->pDestDb->mut
3db0: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
3dc0: 65 74 61 63 68 20 74 68 69 73 20 62 61 63 6b 75  etach this backu
3dd0: 70 20 66 72 6f 6d 20 74 68 65 20 73 6f 75 72 63  p from the sourc
3de0: 65 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 69 66  e pager. */.  if
3df0: 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29 7b 0a  ( p->pDestDb ){.
3e00: 20 20 20 20 70 70 20 3d 20 73 71 6c 69 74 65 33      pp = sqlite3
3e10: 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 73  PagerBackupPtr(s
3e20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
3e30: 28 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 20 20  (p->pSrc));.    
3e40: 77 68 69 6c 65 28 20 2a 70 70 21 3d 70 20 29 7b  while( *pp!=p ){
3e50: 0a 20 20 20 20 20 20 70 70 20 3d 20 26 28 2a 70  .      pp = &(*p
3e60: 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p)->pNext;.    }
3e70: 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  .    *pp = p->pN
3e80: 65 78 74 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  ext;.    p->pSrc
3e90: 2d 3e 6e 42 61 63 6b 75 70 2d 2d 3b 0a 20 20 7d  ->nBackup--;.  }
3ea0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
3eb0: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 69 6c 6c  saction is still
3ec0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 74 72   open on the Btr
3ed0: 65 65 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  ee, roll it back
3ee0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74  . */.  sqlite3Bt
3ef0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2d 3e 70  reeRollback(p->p
3f00: 44 65 73 74 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Dest);..  /* Set
3f10: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
3f20: 6f 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  of the destinati
3f30: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
3f40: 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70  le. */.  rc = (p
3f50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ->rc==SQLITE_DON
3f60: 45 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  E) ? SQLITE_OK :
3f70: 20 70 2d 3e 72 63 3b 0a 20 20 73 71 6c 69 74 65   p->rc;.  sqlite
3f80: 33 45 72 72 6f 72 28 70 2d 3e 70 44 65 73 74 44  3Error(p->pDestD
3f90: 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  b, rc, 0);..  /*
3fa0: 20 45 78 69 74 20 74 68 65 20 6d 75 74 65 78 65   Exit the mutexe
3fb0: 73 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 62  s and free the b
3fc0: 61 63 6b 75 70 20 63 6f 6e 74 65 78 74 20 73 74  ackup context st
3fd0: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66  ructure. */.  if
3fe0: 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29 7b 0a  ( p->pDestDb ){.
3ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
4000: 78 5f 6c 65 61 76 65 28 70 2d 3e 70 44 65 73 74  x_leave(p->pDest
4010: 44 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  Db->mutex);.  }.
4020: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4030: 61 76 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ave(p->pSrc);.  
4040: 69 66 28 20 70 2d 3e 70 44 65 73 74 44 62 20 29  if( p->pDestDb )
4050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4060: 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ee(p);.  }.  sql
4070: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4080: 28 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  (mutex);.  retur
4090: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
40a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
40b0: 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
40c0: 74 6f 20 62 65 20 62 61 63 6b 65 64 20 75 70 20  to be backed up 
40d0: 61 73 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  as of the most r
40e0: 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f  ecent.** call to
40f0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
4100: 73 74 65 70 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  step()..*/.int s
4110: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 72 65  qlite3_backup_re
4120: 6d 61 69 6e 69 6e 67 28 73 71 6c 69 74 65 33 5f  maining(sqlite3_
4130: 62 61 63 6b 75 70 20 2a 70 29 7b 0a 20 20 72 65  backup *p){.  re
4140: 74 75 72 6e 20 70 2d 3e 6e 52 65 6d 61 69 6e 69  turn p->nRemaini
4150: 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ng;.}../*.** Ret
4160: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
4170: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4180: 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61   the source data
4190: 62 61 73 65 20 61 73 20 6f 66 20 74 68 65 20 6d  base as of the m
41a0: 6f 73 74 20 0a 2a 2a 20 72 65 63 65 6e 74 20 63  ost .** recent c
41b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 62  all to sqlite3_b
41c0: 61 63 6b 75 70 5f 73 74 65 70 28 29 2e 0a 2a 2f  ackup_step()..*/
41d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 61 63  .int sqlite3_bac
41e0: 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28 73 71  kup_pagecount(sq
41f0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 29  lite3_backup *p)
4200: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 50  {.  return p->nP
4210: 61 67 65 63 6f 75 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  agecount;.}../*.
4220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4230: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
4240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4250: 20 70 61 67 65 20 69 50 61 67 65 20 6f 66 20 74   page iPage of t
4260: 68 65 0a 2a 2a 20 73 6f 75 72 63 65 20 64 61 74  he.** source dat
4270: 61 62 61 73 65 20 68 61 76 65 20 62 65 65 6e 20  abase have been 
4280: 6d 6f 64 69 66 69 65 64 2e 20 49 66 20 70 61 67  modified. If pag
4290: 65 20 69 50 61 67 65 20 68 61 73 20 61 6c 72 65  e iPage has alre
42a0: 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 63 6f 70  ady been .** cop
42b0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 65 73  ied into the des
42c0: 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61 73  tination databas
42d0: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
42e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
42f0: 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  ** destination i
4300: 73 20 6e 6f 77 20 69 6e 76 61 6c 69 64 61 74 65  s now invalidate
4310: 64 2e 20 54 68 65 20 64 65 73 74 69 6e 61 74 69  d. The destinati
4320: 6f 6e 20 63 6f 70 79 20 6f 66 20 69 50 61 67 65  on copy of iPage
4330: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
4340: 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
4350: 20 6e 65 77 20 64 61 74 61 20 62 65 66 6f 72 65   new data before
4360: 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 65 72   the backup oper
4370: 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 6f 6d 70  ation is.** comp
4380: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  lete..**.** It i
4390: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
43a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
43b0: 74 65 64 20 77 69 74 68 20 74 68 65 20 42 74 53  ted with the BtS
43c0: 68 61 72 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20  hared object.** 
43d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
43e0: 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61   the source data
43f0: 62 61 73 65 20 69 73 20 68 65 6c 64 20 77 68 65  base is held whe
4400: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
4410: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e 0a 2a 2f  is.** called..*/
4420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 61 63  .void sqlite3Bac
4430: 6b 75 70 55 70 64 61 74 65 28 73 71 6c 69 74 65  kupUpdate(sqlite
4440: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
4450: 70 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63  p, Pgno iPage, c
4460: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
4470: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
4480: 70 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  p *p;           
4490: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
44a0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
44b0: 20 20 66 6f 72 28 70 3d 70 42 61 63 6b 75 70 3b    for(p=pBackup;
44c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
44d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
44e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
44f0: 70 2d 3e 70 53 72 63 2d 3e 70 42 74 2d 3e 6d 75  p->pSrc->pBt->mu
4500: 74 65 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  tex) );.    if( 
4510: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
4520: 20 26 26 20 69 50 61 67 65 3c 70 2d 3e 69 4e 65   && iPage<p->iNe
4530: 78 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  xt ){.      /* T
4540: 68 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  he backup proces
4550: 73 20 70 20 68 61 73 20 61 6c 72 65 61 64 79 20  s p has already 
4560: 63 6f 70 69 65 64 20 70 61 67 65 20 69 50 61 67  copied page iPag
4570: 65 2e 20 42 75 74 20 6e 6f 77 20 69 74 0a 20 20  e. But now it.  
4580: 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
4590: 6d 6f 64 69 66 69 65 64 20 62 79 20 61 20 74 72  modified by a tr
45a0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
45b0: 20 73 6f 75 72 63 65 20 70 61 67 65 72 2e 20 43   source pager. C
45c0: 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  opy.      ** the
45d0: 20 6e 65 77 20 64 61 74 61 20 69 6e 74 6f 20 74   new data into t
45e0: 68 65 20 62 61 63 6b 75 70 2e 0a 20 20 20 20 20  he backup..     
45f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63   */.      int rc
4600: 20 3d 20 62 61 63 6b 75 70 4f 6e 65 50 61 67 65   = backupOnePage
4610: 28 70 2c 20 69 50 61 67 65 2c 20 61 44 61 74 61  (p, iPage, aData
4620: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
4630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4640: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
4650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4660: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
4670: 74 61 72 74 20 74 68 65 20 62 61 63 6b 75 70 20  tart the backup 
4680: 70 72 6f 63 65 73 73 2e 20 54 68 69 73 20 69 73  process. This is
4690: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
46a0: 20 70 61 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20   pager layer.** 
46b0: 64 65 74 65 63 74 73 20 74 68 61 74 20 74 68 65  detects that the
46c0: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
46d0: 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61  en modified by a
46e0: 6e 20 65 78 74 65 72 6e 61 6c 20 64 61 74 61 62  n external datab
46f0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
4700: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
4710: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
4720: 6f 66 20 6b 6e 6f 77 69 6e 67 20 77 68 69 63 68  of knowing which
4730: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 73   of the.** pages
4740: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
4750: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
4760: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
4770: 62 61 73 65 20 61 72 65 20 73 74 69 6c 6c 20 0a  base are still .
4780: 2a 2a 20 76 61 6c 69 64 20 61 6e 64 20 77 68 69  ** valid and whi
4790: 63 68 20 61 72 65 20 6e 6f 74 2c 20 73 6f 20 74  ch are not, so t
47a0: 68 65 20 65 6e 74 69 72 65 20 70 72 6f 63 65 73  he entire proces
47b0: 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
47c0: 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  started..**.** I
47d0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
47e0: 74 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  t the mutex asso
47f0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4800: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 0a  BtShared object.
4810: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
4820: 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 64   to the source d
4830: 61 74 61 62 61 73 65 20 69 73 20 68 65 6c 64 20  atabase is held 
4840: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
4850: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e  on is.** called.
4860: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4870: 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 73 71  BackupRestart(sq
4880: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
4890: 61 63 6b 75 70 29 7b 0a 20 20 73 71 6c 69 74 65  ackup){.  sqlite
48a0: 33 5f 62 61 63 6b 75 70 20 2a 70 3b 20 20 20 20  3_backup *p;    
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48c0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
48d0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  ble */.  for(p=p
48e0: 42 61 63 6b 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  Backup; p; p=p->
48f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65  pNext){.    asse
4900: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4910: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 72 63 2d 3e  x_held(p->pSrc->
4920: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4930: 20 20 20 70 2d 3e 69 4e 65 78 74 20 3d 20 31 3b     p->iNext = 1;
4940: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
4950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
4960: 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
4970: 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
4980: 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
4990: 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
49a0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
49b0: 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
49c0: 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
49d0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
49e0: 65 20 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64  e pTo may be red
49f0: 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  uced by this ope
4a00: 72 61 74 69 6f 6e 2e 20 49 66 20 61 6e 79 74 68  ration. If anyth
4a10: 69 6e 67 20 0a 2a 2a 20 67 6f 65 73 20 77 72 6f  ing .** goes wro
4a20: 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ng, the transact
4a30: 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f  ion on pTo is ro
4a40: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 73 75  lled back. If su
4a50: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 0a 2a  ccessful, the .*
4a60: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
4a70: 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 66 6f 72   committed befor
4a80: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
4a90: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
4aa0: 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
4ab0: 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
4ac0: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
4ad0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 62  sqlite3_backup b
4ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4af0: 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73 71  Enter(pTo);.  sq
4b00: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
4b10: 70 46 72 6f 6d 29 3b 0a 0a 20 20 2f 2a 20 53 65  pFrom);..  /* Se
4b20: 74 20 75 70 20 61 6e 20 73 71 6c 69 74 65 33 5f  t up an sqlite3_
4b30: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 2e 20 73  backup object. s
4b40: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 2e 70 44  qlite3_backup.pD
4b50: 65 73 74 44 62 20 6d 75 73 74 20 62 65 20 73 65  estDb must be se
4b60: 74 0a 20 20 2a 2a 20 74 6f 20 30 2e 20 54 68 69  t.  ** to 0. Thi
4b70: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
4b80: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
4b90: 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   of sqlite3_back
4ba0: 75 70 5f 73 74 65 70 28 29 0a 20 20 2a 2a 20 61  up_step().  ** a
4bb0: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
4bc0: 70 5f 66 69 6e 69 73 68 28 29 20 74 6f 20 64 65  p_finish() to de
4bd0: 74 65 63 74 20 74 68 61 74 20 74 68 65 79 20 61  tect that they a
4be0: 72 65 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a  re being called.
4bf0: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 66    ** from this f
4c00: 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 64 69 72  unction, not dir
4c10: 65 63 74 6c 79 20 62 79 20 74 68 65 20 75 73 65  ectly by the use
4c20: 72 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  r..  */.  memset
4c30: 28 26 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  (&b, 0, sizeof(b
4c40: 29 29 3b 0a 20 20 62 2e 70 53 72 63 44 62 20 3d  ));.  b.pSrcDb =
4c50: 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 20 20 62 2e   pFrom->db;.  b.
4c60: 70 53 72 63 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  pSrc = pFrom;.  
4c70: 62 2e 70 44 65 73 74 20 3d 20 70 54 6f 3b 0a 20  b.pDest = pTo;. 
4c80: 20 62 2e 69 4e 65 78 74 20 3d 20 31 3b 0a 0a 20   b.iNext = 1;.. 
4c90: 20 2f 2a 20 30 78 37 46 46 46 46 46 46 46 20 69   /* 0x7FFFFFFF i
4ca0: 73 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  s the hard limit
4cb0: 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
4cc0: 6f 66 20 70 61 67 65 73 20 69 6e 20 61 20 64 61  of pages in a da
4cd0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
4ce0: 2e 20 42 79 20 70 61 73 73 69 6e 67 20 74 68 69  . By passing thi
4cf0: 73 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20  s as the number 
4d00: 6f 66 20 70 61 67 65 73 20 74 6f 20 63 6f 70 79  of pages to copy
4d10: 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
4d20: 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 29 2c 20  _backup_step(), 
4d30: 77 65 20 63 61 6e 20 67 75 61 72 61 6e 74 65 65  we can guarantee
4d40: 20 74 68 61 74 20 74 68 65 20 63 6f 70 79 20 66   that the copy f
4d50: 69 6e 69 73 68 65 73 20 0a 20 20 2a 2a 20 77 69  inishes .  ** wi
4d60: 74 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 61  thin a single ca
4d70: 6c 6c 20 28 75 6e 6c 65 73 73 20 61 6e 20 65 72  ll (unless an er
4d80: 72 6f 72 20 6f 63 63 75 72 73 29 2e 20 54 68 65  ror occurs). The
4d90: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
4da0: 65 6e 74 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20  ent.  ** checks 
4db0: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 20  this assumption 
4dc0: 2d 20 28 70 2d 3e 72 63 29 20 73 68 6f 75 6c 64  - (p->rc) should
4dd0: 20 62 65 20 73 65 74 20 74 6f 20 65 69 74 68 65   be set to eithe
4de0: 72 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 20  r SQLITE_DONE . 
4df0: 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
4e00: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
4e10: 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
4e20: 28 26 62 2c 20 30 78 37 46 46 46 46 46 46 46 29  (&b, 0x7FFFFFFF)
4e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 62 2e 72 63  ;.  assert( b.rc
4e40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
4e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61   rc = sqlite3_ba
4e60: 63 6b 75 70 5f 66 69 6e 69 73 68 28 26 62 29 3b  ckup_finish(&b);
4e70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4e80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 6f 2d  E_OK ){.    pTo-
4e90: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69  >pBt->pageSizeFi
4ea0: 78 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  xed = 0;.  }..  
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4ec0: 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69  e(pFrom);.  sqli
4ed0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 54  te3BtreeLeave(pT
4ee0: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
4ef0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4f00: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20  ITE_OMIT_VACUUM 
4f10: 2a 2f 0a                                         */.