/ Hex Artifact Content
Login

Artifact b2c0b5e6ae1a89affc0edfc127ebfa5f637a0ce4:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ile contains a c
0190: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 70 70 6c  ommand-line appl
01a0: 69 63 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ication that use
01b0: 73 20 74 68 65 20 52 42 55 20 0a 2a 2a 20 65 78  s the RBU .** ex
01c0: 74 65 6e 73 69 6f 6e 2e 20 53 65 65 20 74 68 65  tension. See the
01d0: 20 75 73 61 67 65 28 29 20 66 75 6e 63 74 69 6f   usage() functio
01e0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e 20 65  n below for an e
01f0: 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a  xplanation..*/..
0200: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0210: 33 72 62 75 2e 68 22 0a 23 69 6e 63 6c 75 64 65  3rbu.h".#include
0220: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  h>../*.** Print 
0260: 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20  a usage message 
0270: 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69  and exit..*/.voi
0280: 64 20 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68  d usage(const ch
0290: 61 72 20 2a 7a 41 72 67 76 30 29 7b 0a 20 20 66  ar *zArgv0){.  f
02a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 0a  printf(stderr, .
02b0: 22 55 73 61 67 65 3a 20 25 73 20 3f 4f 50 54 49  "Usage: %s ?OPTI
02c0: 4f 4e 53 3f 20 54 41 52 47 45 54 2d 44 42 20 52  ONS? TARGET-DB R
02d0: 42 55 2d 44 42 5c 6e 22 0a 22 5c 6e 22 0a 22 57  BU-DB\n"."\n"."W
02e0: 68 65 72 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  here options are
02f0: 3a 5c 6e 22 0a 22 5c 6e 22 0a 22 20 20 20 20 2d  :\n"."\n"."    -
0300: 73 74 65 70 20 4e 53 54 45 50 5c 6e 22 0a 22 20  step NSTEP\n"." 
0310: 20 20 20 2d 76 61 63 75 75 6d 5c 6e 22 0a 22 5c     -vacuum\n"."\
0320: 6e 22 0a 22 20 20 49 66 20 74 68 65 20 2d 76 61  n"."  If the -va
0330: 63 75 75 6d 20 73 77 69 74 63 68 20 69 73 20 6e  cuum switch is n
0340: 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 72 67 75  ot present, argu
0350: 6d 65 6e 74 20 52 42 55 2d 44 42 20 6d 75 73 74  ment RBU-DB must
0360: 20 62 65 20 61 6e 20 52 42 55 5c 6e 22 0a 22 20   be an RBU\n"." 
0370: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
0380: 6e 69 6e 67 20 61 6e 20 75 70 64 61 74 65 20 73  ning an update s
0390: 75 69 74 61 62 6c 65 20 66 6f 72 20 74 61 72 67  uitable for targ
03a0: 65 74 20 64 61 74 61 62 61 73 65 20 54 41 52 47  et database TARG
03b0: 45 54 2d 44 42 2e 5c 6e 22 0a 22 20 20 4f 72 2c  ET-DB.\n"."  Or,
03c0: 20 69 66 20 2d 76 61 63 75 75 6d 20 69 73 20 73   if -vacuum is s
03d0: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 54  pecified, then T
03e0: 41 52 47 45 54 2d 44 42 20 69 73 20 61 20 64 61  ARGET-DB is a da
03f0: 74 61 62 61 73 65 20 74 6f 20 76 61 63 75 75 6d  tabase to vacuum
0400: 20 75 73 69 6e 67 5c 6e 22 0a 22 20 20 52 42 55   using\n"."  RBU
0410: 2c 20 61 6e 64 20 52 42 55 2d 44 42 20 69 73 20  , and RBU-DB is 
0420: 75 73 65 64 20 61 73 20 74 68 65 20 73 74 61 74  used as the stat
0430: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74  e database for t
0440: 68 65 20 76 61 63 75 75 6d 20 28 72 65 66 65 72  he vacuum (refer
0450: 20 74 6f 5c 6e 22 0a 22 20 20 41 50 49 20 64 6f   to\n"."  API do
0460: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
0470: 64 65 74 61 69 6c 73 29 2e 5c 6e 22 0a 22 5c 6e  details).\n"."\n
0480: 22 0a 22 20 20 49 66 20 4e 53 54 45 50 20 69 73  "."  If NSTEP is
0490: 20 73 65 74 20 74 6f 20 6c 65 73 73 20 74 68 61   set to less tha
04a0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
04b0: 72 6f 20 28 74 68 65 20 64 65 66 61 75 6c 74 20  ro (the default 
04c0: 76 61 6c 75 65 29 2c 20 74 68 69 73 20 5c 6e 22  value), this \n"
04d0: 0a 22 20 20 70 72 6f 67 72 61 6d 20 61 74 74 65  ."  program atte
04e0: 6d 70 74 73 20 74 6f 20 70 65 72 66 6f 72 6d 20  mpts to perform 
04f0: 74 68 65 20 65 6e 74 69 72 65 20 75 70 64 61 74  the entire updat
0500: 65 20 6f 72 20 76 61 63 75 75 6d 20 6f 70 65 72  e or vacuum oper
0510: 61 74 69 6f 6e 20 62 65 66 6f 72 65 5c 6e 22 0a  ation before\n".
0520: 22 20 20 65 78 69 74 69 6e 67 5c 6e 22 0a 22 5c  "  exiting\n"."\
0530: 6e 22 0a 22 20 20 49 66 20 4e 53 54 45 50 20 69  n"."  If NSTEP i
0540: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
0550: 65 72 6f 2c 20 74 68 65 6e 20 61 20 6d 61 78 69  ero, then a maxi
0560: 6d 75 6d 20 6f 66 20 4e 53 54 45 50 20 63 61 6c  mum of NSTEP cal
0570: 6c 73 20 61 72 65 20 6d 61 64 65 5c 6e 22 0a 22  ls are made\n"."
0580: 20 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f    to sqlite3rbu_
0590: 73 74 65 70 28 29 2e 20 49 66 20 74 68 65 20 52  step(). If the R
05a0: 42 55 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f  BU update has no
05b0: 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
05c0: 79 20 61 70 70 6c 69 65 64 5c 6e 22 0a 22 20 20  y applied\n"."  
05d0: 61 66 74 65 72 20 74 68 65 20 4e 53 54 45 50 27  after the NSTEP'
05e0: 74 68 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 2c  th call is made,
05f0: 20 74 68 65 20 73 74 61 74 65 20 69 73 20 73 61   the state is sa
0600: 76 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  ved in the datab
0610: 61 73 65 20 52 42 55 2d 44 42 5c 6e 22 0a 22 20  ase RBU-DB\n"." 
0620: 20 61 6e 64 20 74 68 65 20 70 72 6f 67 72 61 6d   and the program
0630: 20 65 78 69 74 73 2e 20 53 75 62 73 65 71 75 65   exits. Subseque
0640: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f  nt invocations o
0650: 66 20 74 68 69 73 20 28 6f 72 20 61 6e 79 20 6f  f this (or any o
0660: 74 68 65 72 20 52 42 55 29 5c 6e 22 0a 22 20 20  ther RBU)\n"."  
0670: 61 70 70 6c 69 63 61 74 69 6f 6e 20 77 69 6c 6c  application will
0680: 20 75 73 65 20 74 68 69 73 20 73 74 61 74 65 20   use this state 
0690: 74 6f 20 72 65 73 75 6d 65 20 61 70 70 6c 79 69  to resume applyi
06a0: 6e 67 20 74 68 65 20 52 42 55 20 75 70 64 61 74  ng the RBU updat
06b0: 65 20 74 6f 20 74 68 65 5c 6e 22 0a 22 20 20 74  e to the\n"."  t
06c0: 61 72 67 65 74 20 64 62 2e 5c 6e 22 0a 22 5c 6e  arget db.\n"."\n
06d0: 22 0a 2c 20 7a 41 72 67 76 30 29 3b 0a 20 20 65  "., zArgv0);.  e
06e0: 78 69 74 28 31 29 3b 0a 7d 0a 0a 76 6f 69 64 20  xit(1);.}..void 
06f0: 72 65 70 6f 72 74 5f 64 65 66 61 75 6c 74 5f 76  report_default_v
0700: 66 73 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  fs(){.  sqlite3_
0710: 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69  vfs *pVfs = sqli
0720: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
0730: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
0740: 74 2c 20 22 64 65 66 61 75 6c 74 20 76 66 73 20  t, "default vfs 
0750: 69 73 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70 56  is \"%s\"\n", pV
0760: 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 76  fs->zName);.}..v
0770: 6f 69 64 20 72 65 70 6f 72 74 5f 72 62 75 5f 76  oid report_rbu_v
0780: 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  fs(sqlite3rbu *p
0790: 52 62 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  Rbu){.  sqlite3 
07a0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 72 62 75  *db = sqlite3rbu
07b0: 5f 64 62 28 70 52 62 75 2c 20 30 29 3b 0a 20 20  _db(pRbu, 0);.  
07c0: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 63 68  if( db ){.    ch
07d0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
07e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f     sqlite3_file_
07f0: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
0800: 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
0810: 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 4e 61 6d 65  _VFSNAME, &zName
0820: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
0830: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
0840: 66 28 73 74 64 6f 75 74 2c 20 22 75 73 69 6e 67  f(stdout, "using
0850: 20 76 66 73 20 5c 22 25 73 5c 22 5c 6e 22 2c 20   vfs \"%s\"\n", 
0860: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
0870: 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
0880: 28 73 74 64 6f 75 74 2c 20 22 76 66 73 20 6e 61  (stdout, "vfs na
0890: 6d 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  me not available
08a0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
08b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
08c0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20  me);.  }.}..int 
08d0: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
08e0: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69  har **argv){.  i
08f0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
0900: 61 72 20 2a 7a 54 61 72 67 65 74 3b 20 20 20 20  ar *zTarget;    
0910: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 72 67 65          /* Targe
0920: 74 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 70  t database to ap
0930: 70 6c 79 20 52 42 55 20 74 6f 20 2a 2f 0a 20 20  ply RBU to */.  
0940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
0950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0960: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
0970: 61 69 6e 69 6e 67 20 52 42 55 20 2a 2f 0a 20 20  aining RBU */.  
0980: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 20  char zBuf[200]; 
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 2f 2a 20 42 75 66 66 65 72 20 66 6f 72 20 70 72  /* Buffer for pr
09b0: 69 6e 74 66 28 29 20 2a 2f 0a 20 20 63 68 61 72  intf() */.  char
09c0: 20 2a 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20   *zErrmsg;      
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
09e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66  rror message, if
09f0: 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65   any */.  sqlite
0a00: 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20  3rbu *pRbu;     
0a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55            /* RBU
0a20: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
0a30: 20 6e 53 74 65 70 20 3d 20 30 3b 20 20 20 20 20   nStep = 0;     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a50: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
0a60: 66 20 73 74 65 70 28 29 20 63 61 6c 6c 73 20 2a  f step() calls *
0a70: 2f 0a 20 20 69 6e 74 20 62 56 61 63 75 75 6d 20  /.  int bVacuum 
0a80: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
0a90: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
0aa0: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
0ab0: 69 6e 74 20 6e 41 72 67 20 3d 20 61 72 67 63 2d  int nArg = argc-
0ac0: 32 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 33  2;..  if( argc<3
0ad0: 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d   ) usage(argv[0]
0ae0: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
0af0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
0b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
0b10: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
0b20: 69 6e 74 20 6e 41 72 67 20 3d 20 73 74 72 6c 65  int nArg = strle
0b30: 6e 28 7a 41 72 67 29 3b 0a 20 20 20 20 69 66 28  n(zArg);.    if(
0b40: 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c   nArg>1 && nArg<
0b50: 3d 38 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  =8 && 0==memcmp(
0b60: 7a 41 72 67 2c 20 22 2d 76 61 63 75 75 6d 22 2c  zArg, "-vacuum",
0b70: 20 6e 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20   nArg) ){.      
0b80: 62 56 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20  bVacuum = 1;.   
0b90: 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e   }else if( nArg>
0ba0: 31 20 26 26 20 6e 41 72 67 3c 3d 35 20 26 26 20  1 && nArg<=5 && 
0bb0: 30 3d 3d 6d 65 6d 63 6d 70 28 7a 41 72 67 2c 20  0==memcmp(zArg, 
0bc0: 22 2d 73 74 65 70 22 2c 20 6e 41 72 67 29 20 26  "-step", nArg) &
0bd0: 26 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20  & i<nArg-1 ){.  
0be0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 6e      i++;.      n
0bf0: 53 74 65 70 20 3d 20 61 74 6f 69 28 61 72 67 76  Step = atoi(argv
0c00: 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [i]);.    }else{
0c10: 0a 20 20 20 20 20 20 75 73 61 67 65 28 61 72 67  .      usage(arg
0c20: 76 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v[0]);.    }.  }
0c30: 0a 0a 20 20 7a 54 61 72 67 65 74 20 3d 20 61 72  ..  zTarget = ar
0c40: 67 76 5b 61 72 67 63 2d 32 5d 3b 0a 20 20 7a 52  gv[argc-2];.  zR
0c50: 62 75 20 3d 20 61 72 67 76 5b 61 72 67 63 2d 31  bu = argv[argc-1
0c60: 5d 3b 0a 0a 20 20 72 65 70 6f 72 74 5f 64 65 66  ];..  report_def
0c70: 61 75 6c 74 5f 76 66 73 28 29 3b 0a 0a 20 20 2f  ault_vfs();..  /
0c80: 2a 20 4f 70 65 6e 20 61 6e 20 52 42 55 20 68 61  * Open an RBU ha
0c90: 6e 64 6c 65 2e 20 41 20 76 61 63 75 75 6d 20 68  ndle. A vacuum h
0ca0: 61 6e 64 6c 65 20 69 66 20 2d 76 61 63 75 75 6d  andle if -vacuum
0cb0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
0cc0: 6f 72 20 61 0a 20 20 2a 2a 20 72 65 67 75 6c 61  or a.  ** regula
0cd0: 72 20 52 42 55 20 75 70 64 61 74 65 20 68 61 6e  r RBU update han
0ce0: 64 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 20 20  dle otherwise.  
0cf0: 2a 2f 0a 20 20 69 66 28 20 62 56 61 63 75 75 6d  */.  if( bVacuum
0d00: 20 29 7b 0a 20 20 20 20 70 52 62 75 20 3d 20 73   ){.    pRbu = s
0d10: 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d  qlite3rbu_vacuum
0d20: 28 7a 54 61 72 67 65 74 2c 20 7a 52 62 75 29 3b  (zTarget, zRbu);
0d30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
0d40: 62 75 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f  bu = sqlite3rbu_
0d50: 6f 70 65 6e 28 7a 54 61 72 67 65 74 2c 20 7a 52  open(zTarget, zR
0d60: 62 75 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  bu, 0);.  }.  re
0d70: 70 6f 72 74 5f 72 62 75 5f 76 66 73 28 70 52 62  port_rbu_vfs(pRb
0d80: 75 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 53 74  u);..  /* If nSt
0d90: 65 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ep is less than 
0da0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
0db0: 2c 20 63 61 6c 6c 0a 20 20 2a 2a 20 73 71 6c 69  , call.  ** sqli
0dc0: 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 75 6e  te3rbu_step() un
0dd0: 74 69 6c 20 65 69 74 68 65 72 20 74 68 65 20 52  til either the R
0de0: 42 55 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  BU has been comp
0df0: 6c 65 74 65 6c 79 20 61 70 70 6c 69 65 64 0a 20  letely applied. 
0e00: 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
0e10: 6f 63 63 75 72 73 2e 20 4f 72 2c 20 69 66 20 6e  occurs. Or, if n
0e20: 53 74 65 70 20 69 73 20 67 72 65 61 74 65 72 20  Step is greater 
0e30: 74 68 61 6e 20 7a 65 72 6f 2c 20 63 61 6c 6c 0a  than zero, call.
0e40: 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f    ** sqlite3rbu_
0e50: 73 74 65 70 28 29 20 61 20 6d 61 78 69 6d 75 6d  step() a maximum
0e60: 20 6f 66 20 6e 53 74 65 70 20 74 69 6d 65 73 2e   of nStep times.
0e70: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
0e80: 28 6e 53 74 65 70 3c 3d 30 20 7c 7c 20 69 3c 6e  (nStep<=0 || i<n
0e90: 53 74 65 70 29 20 26 26 20 73 71 6c 69 74 65 33  Step) && sqlite3
0ea0: 72 62 75 5f 73 74 65 70 28 70 52 62 75 29 3d 3d  rbu_step(pRbu)==
0eb0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 3b  SQLITE_OK; i++);
0ec0: 0a 20 20 6e 50 72 6f 67 72 65 73 73 20 3d 20 73  .  nProgress = s
0ed0: 71 6c 69 74 65 33 72 62 75 5f 70 72 6f 67 72 65  qlite3rbu_progre
0ee0: 73 73 28 70 52 62 75 29 3b 0a 20 20 72 63 20 3d  ss(pRbu);.  rc =
0ef0: 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f 73   sqlite3rbu_clos
0f00: 65 28 70 52 62 75 2c 20 26 7a 45 72 72 6d 73 67  e(pRbu, &zErrmsg
0f10: 29 3b 0a 0a 20 20 2f 2a 20 4c 65 74 20 74 68 65  );..  /* Let the
0f20: 20 75 73 65 72 20 6b 6e 6f 77 20 77 68 61 74 20   user know what 
0f30: 68 61 70 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 73  happened. */.  s
0f40: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
0f50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
0f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
0f70: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
0f80: 42 75 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20  Buf), zBuf,.    
0f90: 20 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4b        "SQLITE_OK
0fa0: 3a 20 72 62 75 20 75 70 64 61 74 65 20 69 6e 63  : rbu update inc
0fb0: 6f 6d 70 6c 65 74 65 20 28 25 6c 6c 64 20 6f 70  omplete (%lld op
0fc0: 65 72 61 74 69 6f 6e 73 20 73 6f 20 66 61 72 29  erations so far)
0fd0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
0fe0: 50 72 6f 67 72 65 73 73 0a 20 20 20 20 20 20 29  Progress.      )
0ff0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1000: 73 74 64 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  stdout, "%s", zB
1010: 75 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  uf);.      break
1020: 3b 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ;..    case SQLI
1030: 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20 20 73  TE_DONE:.      s
1040: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1050: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1060: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  uf,.          "S
1070: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 72 62 75 20  QLITE_DONE: rbu 
1080: 75 70 64 61 74 65 20 63 6f 6d 70 6c 65 74 65 64  update completed
1090: 20 28 25 6c 6c 64 20 6f 70 65 72 61 74 69 6f 6e   (%lld operation
10a0: 73 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s)\n",.         
10b0: 20 6e 50 72 6f 67 72 65 73 73 0a 20 20 20 20 20   nProgress.     
10c0: 20 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   );.      fprint
10d0: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 22 2c 20  f(stdout, "%s", 
10e0: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 62 72 65  zBuf);.      bre
10f0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
1100: 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
1110: 73 74 64 65 72 72 2c 20 22 65 72 72 6f 72 3d 25  stderr, "error=%
1120: 64 3a 20 25 73 5c 6e 22 2c 20 72 63 2c 20 7a 45  d: %s\n", rc, zE
1130: 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 62 72  rrmsg);.      br
1140: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  eak;.  }..  sqli
1150: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67  te3_free(zErrmsg
1160: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  );.  return (rc=
1170: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
1180: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 20 3f  ==SQLITE_DONE) ?
1190: 20 30 20 3a 20 31 3b 0a 7d 0a                     0 : 1;.}.