/ Hex Artifact Content
Login

Artifact c129c91127e9b46e335715ae2e75756e25ba27de:


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 65 73 74 20  e contains test 
0190: 6c 6f 67 69 63 20 66 6f 72 20 74 68 65 20 73 71  logic for the sq
01a0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 28 29 20 69  lite3_backup() i
01b0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2f 0a  nterface..**.*/.
01c0: 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68  .#include "tcl.h
01d0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69  ".#include <sqli
01e0: 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  te3.h>.#include 
01f0: 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 20 54  <assert.h>../* T
0200: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
0210: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  re implemented i
0220: 6e 20 74 65 73 74 31 2e 63 2e 20 2a 2f 0a 69 6e  n test1.c. */.in
0230: 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54  t getDbPointer(T
0240: 63 6c 5f 49 6e 74 65 72 70 20 2a 2c 20 63 6f 6e  cl_Interp *, con
0250: 73 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74  st char *, sqlit
0260: 65 33 20 2a 2a 29 3b 0a 63 6f 6e 73 74 20 63 68  e3 **);.const ch
0270: 61 72 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45  ar *sqlite3TestE
0280: 72 72 6f 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 0a  rrorName(int);..
0290: 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b 75  static int backu
02a0: 70 54 65 73 74 43 6d 64 28 0a 20 20 43 6c 69 65  pTestCmd(.  Clie
02b0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
02c0: 61 2c 20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  a, .  Tcl_Interp
02d0: 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 69 6e 74   *interp, .  int
02e0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
02f0: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
0300: 20 20 65 6e 75 6d 20 42 61 63 6b 75 70 53 75 62    enum BackupSub
0310: 43 6f 6d 6d 61 6e 64 45 6e 75 6d 20 7b 0a 20 20  CommandEnum {.  
0320: 20 20 42 41 43 4b 55 50 5f 53 54 45 50 2c 20 42    BACKUP_STEP, B
0330: 41 43 4b 55 50 5f 46 49 4e 49 53 48 2c 20 42 41  ACKUP_FINISH, BA
0340: 43 4b 55 50 5f 52 45 4d 41 49 4e 49 4e 47 2c 20  CKUP_REMAINING, 
0350: 42 41 43 4b 55 50 5f 50 41 47 45 43 4f 55 4e 54  BACKUP_PAGECOUNT
0360: 0a 20 20 7d 3b 0a 20 20 73 74 72 75 63 74 20 42  .  };.  struct B
0370: 61 63 6b 75 70 53 75 62 43 6f 6d 6d 61 6e 64 20  ackupSubCommand 
0380: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0390: 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 65 6e 75 6d   *zCmd;.    enum
03a0: 20 42 61 63 6b 75 70 53 75 62 43 6f 6d 6d 61 6e   BackupSubComman
03b0: 64 45 6e 75 6d 20 65 43 6d 64 3b 0a 20 20 20 20  dEnum eCmd;.    
03c0: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 63 6f  int nArg;.    co
03d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
03e0: 20 20 7d 20 61 53 75 62 5b 5d 20 3d 20 7b 0a 20    } aSub[] = {. 
03f0: 20 20 20 7b 22 73 74 65 70 22 2c 20 20 20 20 20     {"step",     
0400: 20 42 41 43 4b 55 50 5f 53 54 45 50 20 20 20 20   BACKUP_STEP    
0410: 20 20 2c 20 31 2c 20 22 6e 70 61 67 65 22 20 7d    , 1, "npage" }
0420: 2c 0a 20 20 20 20 7b 22 66 69 6e 69 73 68 22 2c  ,.    {"finish",
0430: 20 20 20 20 42 41 43 4b 55 50 5f 46 49 4e 49 53      BACKUP_FINIS
0440: 48 20 20 20 20 2c 20 30 2c 20 22 22 20 20 20 20  H    , 0, ""    
0450: 20 20 7d 2c 0a 20 20 20 20 7b 22 72 65 6d 61 69    },.    {"remai
0460: 6e 69 6e 67 22 2c 20 42 41 43 4b 55 50 5f 52 45  ning", BACKUP_RE
0470: 4d 41 49 4e 49 4e 47 20 2c 20 30 2c 20 22 22 20  MAINING , 0, "" 
0480: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 22 70 61       },.    {"pa
0490: 67 65 63 6f 75 6e 74 22 2c 20 42 41 43 4b 55 50  gecount", BACKUP
04a0: 5f 50 41 47 45 43 4f 55 4e 54 20 2c 20 30 2c 20  _PAGECOUNT , 0, 
04b0: 22 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ""      },.    {
04c0: 30 2c 20 30 2c 20 30 2c 20 30 7d 0a 20 20 7d 3b  0, 0, 0, 0}.  };
04d0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ..  sqlite3_back
04e0: 75 70 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33  up *p = (sqlite3
04f0: 5f 62 61 63 6b 75 70 20 2a 29 63 6c 69 65 6e 74  _backup *)client
0500: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 43 6d 64  Data;.  int iCmd
0510: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
0520: 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  c = Tcl_GetIndex
0530: 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20  FromObjStruct(. 
0540: 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a       interp, obj
0550: 76 5b 31 5d 2c 20 61 53 75 62 2c 20 73 69 7a 65  v[1], aSub, size
0560: 6f 66 28 61 53 75 62 5b 30 5d 29 2c 20 22 6f 70  of(aSub[0]), "op
0570: 74 69 6f 6e 22 2c 20 30 2c 20 26 69 43 6d 64 0a  tion", 0, &iCmd.
0580: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54    );.  if( rc!=T
0590: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  CL_OK ){.    ret
05a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
05b0: 28 20 6f 62 6a 63 21 3d 28 32 20 2b 20 61 53 75  ( objc!=(2 + aSu
05c0: 62 5b 69 43 6d 64 5d 2e 6e 41 72 67 29 20 29 7b  b[iCmd].nArg) ){
05d0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
05e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
05f0: 20 6f 62 6a 76 2c 20 61 53 75 62 5b 69 43 6d 64   objv, aSub[iCmd
0600: 5d 2e 7a 41 72 67 29 3b 0a 20 20 20 20 72 65 74  ].zArg);.    ret
0610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0620: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 61 53   }..  switch( aS
0630: 75 62 5b 69 43 6d 64 5d 2e 65 43 6d 64 20 29 7b  ub[iCmd].eCmd ){
0640: 0a 0a 20 20 20 20 63 61 73 65 20 42 41 43 4b 55  ..    case BACKU
0650: 50 5f 46 49 4e 49 53 48 3a 20 7b 0a 20 20 20 20  P_FINISH: {.    
0660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
0670: 6d 64 4e 61 6d 65 3b 0a 20 20 20 20 20 20 54 63  mdName;.      Tc
0680: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0690: 6f 3b 0a 20 20 20 20 20 20 7a 43 6d 64 4e 61 6d  o;.      zCmdNam
06a0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
06b0: 67 28 6f 62 6a 76 5b 30 5d 29 3b 0a 20 20 20 20  g(objv[0]);.    
06c0: 20 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64    Tcl_GetCommand
06d0: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 43 6d  Info(interp, zCm
06e0: 64 4e 61 6d 65 2c 20 26 63 6d 64 49 6e 66 6f 29  dName, &cmdInfo)
06f0: 3b 0a 20 20 20 20 20 20 63 6d 64 49 6e 66 6f 2e  ;.      cmdInfo.
0700: 64 65 6c 65 74 65 50 72 6f 63 20 3d 20 30 3b 0a  deleteProc = 0;.
0710: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 43 6f 6d        Tcl_SetCom
0720: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
0730: 20 7a 43 6d 64 4e 61 6d 65 2c 20 26 63 6d 64 49   zCmdName, &cmdI
0740: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nfo);.      Tcl_
0750: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  DeleteCommand(in
0760: 74 65 72 70 2c 20 7a 43 6d 64 4e 61 6d 65 29 3b  terp, zCmdName);
0770: 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
0780: 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
0790: 73 68 28 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  sh(p);.      Tcl
07a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
07b0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
07c0: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
07d0: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
07e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
07f0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 42     }..    case B
0800: 41 43 4b 55 50 5f 53 54 45 50 3a 20 7b 0a 20 20  ACKUP_STEP: {.  
0810: 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
0820: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
0830: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
0840: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
0850: 32 5d 2c 20 26 6e 50 61 67 65 29 20 29 7b 0a 20  2], &nPage) ){. 
0860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
0870: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
0880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
0890: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
08a0: 70 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  p, nPage);.     
08b0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
08c0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
08d0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
08e0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
08f0: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
0900: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
0910: 73 65 20 42 41 43 4b 55 50 5f 52 45 4d 41 49 4e  se BACKUP_REMAIN
0920: 49 4e 47 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ING:.      Tcl_S
0930: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
0940: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
0950: 6a 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  j(sqlite3_backup
0960: 5f 72 65 6d 61 69 6e 69 6e 67 28 70 29 29 29 3b  _remaining(p)));
0970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
0980: 20 20 20 63 61 73 65 20 42 41 43 4b 55 50 5f 50     case BACKUP_P
0990: 41 47 45 43 4f 55 4e 54 3a 0a 20 20 20 20 20 20  AGECOUNT:.      
09a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
09b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
09c0: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  IntObj(sqlite3_b
09d0: 61 63 6b 75 70 5f 70 61 67 65 63 6f 75 6e 74 28  ackup_pagecount(
09e0: 70 29 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  p)));.      brea
09f0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
0a00: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
0a10: 69 63 20 76 6f 69 64 20 62 61 63 6b 75 70 54 65  ic void backupTe
0a20: 73 74 46 69 6e 69 73 68 28 43 6c 69 65 6e 74 44  stFinish(ClientD
0a30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 7b  ata clientData){
0a40: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
0a50: 70 20 2a 70 42 61 63 6b 75 70 20 3d 20 28 73 71  p *pBackup = (sq
0a60: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 29 63  lite3_backup *)c
0a70: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 71 6c  lientData;.  sql
0a80: 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
0a90: 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 7d 0a 0a  sh(pBackup);.}..
0aa0: 2f 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  /*.**     sqlite
0ab0: 33 5f 62 61 63 6b 75 70 20 43 4d 44 4e 41 4d 45  3_backup CMDNAME
0ac0: 20 44 45 53 54 48 41 4e 44 4c 45 20 44 45 53 54   DESTHANDLE DEST
0ad0: 4e 41 4d 45 20 53 52 43 48 41 4e 44 4c 45 20 53  NAME SRCHANDLE S
0ae0: 52 43 4e 41 4d 45 0a 2a 2a 0a 2a 2f 0a 73 74 61  RCNAME.**.*/.sta
0af0: 74 69 63 20 69 6e 74 20 62 61 63 6b 75 70 54 65  tic int backupTe
0b00: 73 74 49 6e 69 74 28 0a 20 20 43 6c 69 65 6e 74  stInit(.  Client
0b10: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
0b20: 20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a   .  Tcl_Interp *
0b30: 69 6e 74 65 72 70 2c 20 0a 20 20 69 6e 74 20 6f  interp, .  int o
0b40: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
0b50: 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20  const*objv.){.  
0b60: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
0b70: 70 42 61 63 6b 75 70 3b 0a 20 20 73 71 6c 69 74  pBackup;.  sqlit
0b80: 65 33 20 2a 70 44 65 73 74 44 62 3b 0a 20 20 73  e3 *pDestDb;.  s
0b90: 71 6c 69 74 65 33 20 2a 70 53 72 63 44 62 3b 0a  qlite3 *pSrcDb;.
0ba0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
0bb0: 65 73 74 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  estName;.  const
0bc0: 20 63 68 61 72 20 2a 7a 53 72 63 4e 61 6d 65 3b   char *zSrcName;
0bd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0be0: 43 6d 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Cmd;..  if( objc
0bf0: 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=6 ){.    Tcl_W
0c00: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 20  rongNumArgs(.   
0c10: 20 20 20 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62     interp, 1, ob
0c20: 6a 76 2c 20 22 43 4d 44 4e 41 4d 45 20 44 45 53  jv, "CMDNAME DES
0c30: 54 48 41 4e 44 4c 45 20 44 45 53 54 4e 41 4d 45  THANDLE DESTNAME
0c40: 20 53 52 43 48 41 4e 44 4c 45 20 53 52 43 4e 41   SRCHANDLE SRCNA
0c50: 4d 45 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ME".    );.    r
0c60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0c70: 0a 20 20 7d 0a 0a 20 20 7a 43 6d 64 20 3d 20 54  .  }..  zCmd = T
0c80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
0c90: 76 5b 31 5d 29 3b 0a 20 20 67 65 74 44 62 50 6f  v[1]);.  getDbPo
0ca0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
0cb0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
0cc0: 5b 32 5d 29 2c 20 26 70 44 65 73 74 44 62 29 3b  [2]), &pDestDb);
0cd0: 0a 20 20 7a 44 65 73 74 4e 61 6d 65 20 3d 20 54  .  zDestName = T
0ce0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
0cf0: 76 5b 33 5d 29 3b 0a 20 20 67 65 74 44 62 50 6f  v[3]);.  getDbPo
0d00: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
0d10: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
0d20: 5b 34 5d 29 2c 20 26 70 53 72 63 44 62 29 3b 0a  [4]), &pSrcDb);.
0d30: 20 20 7a 53 72 63 4e 61 6d 65 20 3d 20 54 63 6c    zSrcName = Tcl
0d40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
0d50: 35 5d 29 3b 0a 0a 20 20 70 42 61 63 6b 75 70 20  5]);..  pBackup 
0d60: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
0d70: 5f 69 6e 69 74 28 70 44 65 73 74 44 62 2c 20 7a  _init(pDestDb, z
0d80: 44 65 73 74 4e 61 6d 65 2c 20 70 53 72 63 44 62  DestName, pSrcDb
0d90: 2c 20 7a 53 72 63 4e 61 6d 65 29 3b 0a 20 20 69  , zSrcName);.  i
0da0: 66 28 20 21 70 42 61 63 6b 75 70 20 29 7b 0a 20  f( !pBackup ){. 
0db0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0dc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
0dd0: 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
0de0: 28 29 20 66 61 69 6c 65 64 22 2c 20 30 29 3b 0a  () failed", 0);.
0df0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0e00: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c  RROR;.  }..  Tcl
0e10: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
0e20: 64 28 69 6e 74 65 72 70 2c 20 7a 43 6d 64 2c 20  d(interp, zCmd, 
0e30: 62 61 63 6b 75 70 54 65 73 74 43 6d 64 2c 20 70  backupTestCmd, p
0e40: 42 61 63 6b 75 70 2c 20 62 61 63 6b 75 70 54 65  Backup, backupTe
0e50: 73 74 46 69 6e 69 73 68 29 3b 0a 20 20 54 63 6c  stFinish);.  Tcl
0e60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
0e70: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a  terp, objv[1]);.
0e80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0e90: 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 65  .}..int Sqlitete
0ea0: 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63  stbackup_Init(Tc
0eb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0ec0: 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  ){.  Tcl_CreateO
0ed0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
0ee0: 2c 20 22 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  , "sqlite3_backu
0ef0: 70 22 2c 20 62 61 63 6b 75 70 54 65 73 74 49 6e  p", backupTestIn
0f00: 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  it, 0, 0);.  ret
0f10: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.