/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 9f043b74c46c45b231f4313aed1fccb379a76fe6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 20 46 65 62 72 75  /*.** 2015 Febru
0010: 61 72 79 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 16.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 2a 0a 2a 2f 0a 0a 23 69 6e 63 6c 75  *****.*/..#inclu
0180: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
0190: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
01a0: 54 45 5f 54 45 53 54 29 0a 23 69 66 20 21 64 65  TE_TEST).#if !de
01b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
01c0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
01d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29  LITE_ENABLE_RBU)
01e0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
01f0: 74 65 33 72 62 75 2e 68 22 0a 23 69 6e 63 6c 75  te3rbu.h".#inclu
0200: 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c  de <tcl.h>.#incl
0210: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0220: 2f 2a 20 46 72 6f 6d 20 6d 61 69 6e 2e 63 20 2a  /* From main.c *
0230: 2f 20 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20  / .extern const 
0240: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
0250: 4e 61 6d 65 28 69 6e 74 29 3b 0a 65 78 74 65 72  Name(int);.exter
0260: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73  n int sqlite3Tes
0270: 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
0280: 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61  Tcl_Interp*, cha
0290: 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 0a 76 6f 69  r*, void*);..voi
02a0: 64 20 74 65 73 74 5f 72 62 75 5f 64 65 6c 74 61  d test_rbu_delta
02b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
02c0: 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 41 72 67   *pCtx, int nArg
02d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
02e0: 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 54 63 6c 5f  **apVal){.  Tcl_
02f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
0300: 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 73 71   (Tcl_Interp*)sq
0310: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
0320: 70 43 74 78 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  pCtx);.  Tcl_Obj
0330: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 69 6e 74   *pScript;.  int
0340: 20 69 3b 0a 0a 20 20 70 53 63 72 69 70 74 20 3d   i;..  pScript =
0350: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
0360: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
0370: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63  t(pScript);.  Tc
0380: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
0390: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
03a0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
03b0: 4f 62 6a 28 22 72 62 75 5f 64 65 6c 74 61 22 2c  Obj("rbu_delta",
03c0: 20 2d 31 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30   -1));.  for(i=0
03d0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
03e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
03f0: 65 20 2a 70 49 6e 20 3d 20 61 70 56 61 6c 5b 69  e *pIn = apVal[i
0400: 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ];.    const cha
0410: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
0420: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
0430: 65 5f 74 65 78 74 28 70 49 6e 29 3b 0a 20 20 20  e_text(pIn);.   
0440: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
0450: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
0460: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
0470: 69 6e 67 4f 62 6a 28 7a 2c 20 2d 31 29 29 3b 0a  ingObj(z, -1));.
0480: 20 20 7d 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f    }..  if( TCL_O
0490: 4b 3d 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  K==Tcl_EvalObjEx
04a0: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
04b0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
04c0: 59 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  Y) ){.    const 
04d0: 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65  char *z = Tcl_Ge
04e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
04f0: 74 65 72 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  terp);.    sqlit
0500: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
0510: 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Ctx, z, -1, SQLI
0520: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
0530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
0540: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
0550: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
0560: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
0570: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 0a 73  (pScript);.}...s
0580: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
0590: 71 6c 69 74 65 33 72 62 75 5f 63 6d 64 28 0a 20  qlite3rbu_cmd(. 
05a0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
05b0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
05c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
05d0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
05e0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
05f0: 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  ].){.  int ret =
0600: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74   TCL_OK;.  sqlit
0610: 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28 73  e3rbu *pRbu = (s
0620: 71 6c 69 74 65 33 72 62 75 2a 29 63 6c 69 65 6e  qlite3rbu*)clien
0630: 74 44 61 74 61 3b 0a 20 20 73 74 72 75 63 74 20  tData;.  struct 
0640: 52 62 75 43 6d 64 20 7b 0a 20 20 20 20 63 6f 6e  RbuCmd {.    con
0650: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
0660: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
0670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
0680: 73 61 67 65 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  sage;.  } aCmd[]
0690: 20 3d 20 7b 0a 20 20 20 20 7b 22 73 74 65 70 22   = {.    {"step"
06a0: 2c 20 32 2c 20 22 22 7d 2c 20 20 20 20 20 20 20  , 2, ""},       
06b0: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
06c0: 20 20 20 7b 22 63 6c 6f 73 65 22 2c 20 32 2c 20     {"close", 2, 
06d0: 22 22 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20  ""},            
06e0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 7b 22 63   /* 1 */.    {"c
06f0: 72 65 61 74 65 5f 72 62 75 5f 64 65 6c 74 61 22  reate_rbu_delta"
0700: 2c 20 32 2c 20 22 22 7d 2c 20 20 2f 2a 20 32 20  , 2, ""},  /* 2 
0710: 2a 2f 0a 20 20 20 20 7b 22 73 61 76 65 73 74 61  */.    {"savesta
0720: 74 65 22 2c 20 32 2c 20 22 22 7d 2c 20 20 20 20  te", 2, ""},    
0730: 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20       /* 3 */.   
0740: 20 7b 22 64 62 4d 61 69 6e 5f 65 76 61 6c 22 2c   {"dbMain_eval",
0750: 20 33 2c 20 22 53 51 4c 22 7d 2c 20 20 20 20 2f   3, "SQL"},    /
0760: 2a 20 34 20 2a 2f 0a 20 20 20 20 7b 22 62 70 5f  * 4 */.    {"bp_
0770: 70 72 6f 67 72 65 73 73 22 2c 20 32 2c 20 22 22  progress", 2, ""
0780: 7d 2c 20 20 20 20 20 20 20 2f 2a 20 35 20 2a 2f  },       /* 5 */
0790: 0a 20 20 20 20 7b 22 64 62 22 2c 20 33 2c 20 22  .    {"db", 3, "
07a0: 52 42 55 22 7d 2c 20 20 20 20 20 20 20 20 20 20  RBU"},          
07b0: 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 7b     /* 6 */.    {
07c0: 22 73 74 61 74 65 22 2c 20 32 2c 20 22 22 7d 2c  "state", 2, ""},
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
07e0: 37 20 2a 2f 0a 20 20 20 20 7b 22 70 72 6f 67 72  7 */.    {"progr
07f0: 65 73 73 22 2c 20 32 2c 20 22 22 7d 2c 20 20 20  ess", 2, ""},   
0800: 20 20 20 20 20 20 20 2f 2a 20 38 20 2a 2f 0a 20         /* 8 */. 
0810: 20 20 20 7b 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a     {0,0,0}.  };.
0820: 20 20 69 6e 74 20 69 43 6d 64 3b 0a 0a 20 20 69    int iCmd;..  i
0830: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
0840: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
0850: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
0860: 76 2c 20 22 4d 45 54 48 4f 44 22 29 3b 0a 20 20  v, "METHOD");.  
0870: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0880: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20  OR;.  }.  ret = 
0890: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
08a0: 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20  ObjStruct(.     
08b0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
08c0: 2c 20 61 43 6d 64 2c 20 73 69 7a 65 6f 66 28 61  , aCmd, sizeof(a
08d0: 43 6d 64 5b 30 5d 29 2c 20 22 6d 65 74 68 6f 64  Cmd[0]), "method
08e0: 22 2c 20 30 2c 20 26 69 43 6d 64 0a 20 20 29 3b  ", 0, &iCmd.  );
08f0: 0a 20 20 69 66 28 20 72 65 74 20 29 20 72 65 74  .  if( ret ) ret
0900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0910: 20 69 66 28 20 6f 62 6a 63 21 3d 61 43 6d 64 5b   if( objc!=aCmd[
0920: 69 43 6d 64 5d 2e 6e 41 72 67 20 29 7b 0a 20 20  iCmd].nArg ){.  
0930: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
0940: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
0950: 6a 76 2c 20 61 43 6d 64 5b 69 43 6d 64 5d 2e 7a  jv, aCmd[iCmd].z
0960: 55 73 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  Usage);.    retu
0970: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0980: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 69 43 6d  }..  switch( iCm
0990: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  d ){.    case 0:
09a0: 20 2f 2a 20 73 74 65 70 20 2a 2f 20 7b 0a 20 20   /* step */ {.  
09b0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
09c0: 69 74 65 33 72 62 75 5f 73 74 65 70 28 70 52 62  ite3rbu_step(pRb
09d0: 75 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  u);.      Tcl_Se
09e0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
09f0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
0a00: 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
0a10: 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
0a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0a30: 0a 0a 20 20 20 20 63 61 73 65 20 31 3a 20 2f 2a  ..    case 1: /*
0a40: 20 63 6c 6f 73 65 20 2a 2f 20 7b 0a 20 20 20 20   close */ {.    
0a50: 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 20    char *zErrmsg 
0a60: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
0a70: 63 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 6c  c;.      Tcl_Del
0a80: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
0a90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
0aa0: 28 6f 62 6a 76 5b 30 5d 29 29 3b 0a 20 20 20 20  (objv[0]));.    
0ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62    rc = sqlite3rb
0ac0: 75 5f 63 6c 6f 73 65 28 70 52 62 75 2c 20 26 7a  u_close(pRbu, &z
0ad0: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 69  Errmsg);.      i
0ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
0af0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
0b00: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ONE ){.        T
0b10: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
0b20: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
0b30: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
0b40: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
0b50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
0b60: 74 28 20 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  t( zErrmsg==0 );
0b70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
0b80: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
0b90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
0ba0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0bb0: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
0bc0: 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  c), -1));.      
0bd0: 20 20 69 66 28 20 7a 45 72 72 6d 73 67 20 29 7b    if( zErrmsg ){
0be0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
0bf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0c00: 72 70 2c 20 22 20 2d 20 22 2c 20 7a 45 72 72 6d  rp, " - ", zErrm
0c10: 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  sg, 0);.        
0c20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
0c30: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
0c40: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d   }.        ret =
0c50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0c60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
0c70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
0c80: 20 32 3a 20 2f 2a 20 63 72 65 61 74 65 5f 72 62   2: /* create_rb
0c90: 75 5f 64 65 6c 74 61 20 2a 2f 20 7b 0a 20 20 20  u_delta */ {.   
0ca0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
0cb0: 20 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 70   sqlite3rbu_db(p
0cc0: 52 62 75 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Rbu, 0);.      i
0cd0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
0ce0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
0cf0: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22  .          db, "
0d00: 72 62 75 5f 64 65 6c 74 61 22 2c 20 2d 31 2c 20  rbu_delta", -1, 
0d10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
0d20: 69 64 2a 29 69 6e 74 65 72 70 2c 20 74 65 73 74  id*)interp, test
0d30: 5f 72 62 75 5f 64 65 6c 74 61 2c 20 30 2c 20 30  _rbu_delta, 0, 0
0d40: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
0d50: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
0d60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
0d70: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
0d80: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31  3ErrName(rc), -1
0d90: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 20 3d 20  ));.      ret = 
0da0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
0db0: 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
0dc0: 52 4f 52 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ROR);.      brea
0dd0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
0de0: 73 65 20 33 3a 20 2f 2a 20 73 61 76 65 73 74 61  se 3: /* savesta
0df0: 74 65 20 2a 2f 20 7b 0a 20 20 20 20 20 20 69 6e  te */ {.      in
0e00: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62  t rc = sqlite3rb
0e10: 75 5f 73 61 76 65 73 74 61 74 65 28 70 52 62 75  u_savestate(pRbu
0e20: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
0e30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0e40: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
0e50: 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
0e60: 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
0e70: 20 20 20 72 65 74 20 3d 20 28 72 63 3d 3d 53 51     ret = (rc==SQ
0e80: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
0e90: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20   : TCL_ERROR);. 
0ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0eb0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 34 3a 20 2f  }..    case 4: /
0ec0: 2a 20 64 62 4d 61 69 6e 5f 65 76 61 6c 20 2a 2f  * dbMain_eval */
0ed0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
0ee0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 72 62   *db = sqlite3rb
0ef0: 75 5f 64 62 28 70 52 62 75 2c 20 30 29 3b 0a 20  u_db(pRbu, 0);. 
0f00: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
0f10: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 54  lite3_exec(db, T
0f20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
0f30: 76 5b 32 5d 29 2c 20 30 2c 20 30 2c 20 30 29 3b  v[2]), 0, 0, 0);
0f40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
0f50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0f60: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
0f70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
0f80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
0f90: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
0fa0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  , -1));.        
0fb0: 72 65 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  ret = TCL_ERROR;
0fc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
0fd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
0fe0: 20 63 61 73 65 20 35 3a 20 2f 2a 20 62 70 5f 70   case 5: /* bp_p
0ff0: 72 6f 67 72 65 73 73 20 2a 2f 20 7b 0a 20 20 20  rogress */ {.   
1000: 20 20 20 69 6e 74 20 6f 6e 65 2c 20 74 77 6f 3b     int one, two;
1010: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
1020: 70 4f 62 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  pObj;.      sqli
1030: 74 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65  te3rbu_bp_progre
1040: 73 73 28 70 52 62 75 2c 20 26 6f 6e 65 2c 20 26  ss(pRbu, &one, &
1050: 74 77 6f 29 3b 0a 0a 20 20 20 20 20 20 70 4f 62  two);..      pOb
1060: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  j = Tcl_NewObj()
1070: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
1080: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1090: 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54  (interp, pObj, T
10a0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6e 65  cl_NewIntObj(one
10b0: 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  ));.      Tcl_Li
10c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10d0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c  nt(interp, pObj,
10e0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 74   Tcl_NewIntObj(t
10f0: 77 6f 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  wo));.      Tcl_
1100: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1110: 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20  erp, pObj);.    
1120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1130: 20 20 20 20 63 61 73 65 20 36 3a 20 2f 2a 20 64      case 6: /* d
1140: 62 20 2a 2f 20 7b 0a 20 20 20 20 20 20 69 6e 74  b */ {.      int
1150: 20 62 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28   bArg;.      if(
1160: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
1170: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1180: 62 6a 76 5b 32 5d 2c 20 26 62 41 72 67 29 20 29  bjv[2], &bArg) )
1190: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d 20  {.        ret = 
11a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
11b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11c0: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
11d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
11e0: 64 62 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f  db = sqlite3rbu_
11f0: 64 62 28 70 52 62 75 2c 20 62 41 72 67 29 3b 0a  db(pRbu, bArg);.
1200: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1210: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1220: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1230: 75 66 2c 20 28 76 6f 69 64 2a 29 64 62 29 20 29  uf, (void*)db) )
1240: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 20  {.          ret 
1250: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
1260: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1270: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1290: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
12a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 37      }.    case 7
12d0: 3a 20 2f 2a 20 73 74 61 74 65 20 2a 2f 20 7b 0a  : /* state */ {.
12e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12f0: 20 2a 61 52 65 73 5b 5d 20 3d 20 7b 20 30 2c 20   *aRes[] = { 0, 
1300: 22 6f 61 6c 22 2c 20 22 6d 6f 76 65 22 2c 20 22  "oal", "move", "
1310: 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 22 64 6f  checkpoint", "do
1320: 6e 65 22 2c 20 22 65 72 72 6f 72 22 20 7d 3b 0a  ne", "error" };.
1330: 20 20 20 20 20 20 69 6e 74 20 65 53 74 61 74 65        int eState
1340: 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74   = sqlite3rbu_st
1350: 61 74 65 28 70 52 62 75 29 3b 0a 20 20 20 20 20  ate(pRbu);.     
1360: 20 61 73 73 65 72 74 28 20 65 53 74 61 74 65 3e   assert( eState>
1370: 30 20 26 26 20 65 53 74 61 74 65 3c 3d 35 20 29  0 && eState<=5 )
1380: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
1390: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
13a0: 68 61 72 2a 29 61 52 65 73 5b 65 53 74 61 74 65  har*)aRes[eState
13b0: 5d 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ], TCL_STATIC);.
13c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 2f   }.    case 8: /
13e0: 2a 20 70 72 6f 67 72 65 73 73 20 2a 2f 20 7b 0a  * progress */ {.
13f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
1400: 74 36 34 20 6e 53 74 65 70 20 3d 20 20 73 71 6c  t64 nStep =  sql
1410: 69 74 65 33 72 62 75 5f 70 72 6f 67 72 65 73 73  ite3rbu_progress
1420: 28 70 52 62 75 29 3b 0a 20 20 20 20 20 20 54 63  (pRbu);.      Tc
1430: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1440: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
1450: 64 65 49 6e 74 4f 62 6a 28 6e 53 74 65 70 29 29  deIntObj(nStep))
1460: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1470: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
1480: 74 3a 20 2f 2a 20 73 65 65 6d 73 20 75 6e 6c 69  t: /* seems unli
1490: 6b 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 61 73  kely */.      as
14a0: 73 65 72 74 28 20 21 22 63 61 6e 6e 6f 74 20 68  sert( !"cannot h
14b0: 61 70 70 65 6e 22 20 29 3b 0a 20 20 20 20 20 20  appen" );.      
14c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
14d0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
14e0: 2a 2a 20 54 63 6c 63 6d 64 3a 20 73 71 6c 69 74  ** Tclcmd: sqlit
14f0: 65 33 72 62 75 20 43 4d 44 20 3c 74 61 72 67 65  e3rbu CMD <targe
1500: 74 2d 64 62 3e 20 3c 72 62 75 2d 64 62 3e 20 3f  t-db> <rbu-db> ?
1510: 3c 73 74 61 74 65 2d 64 62 3e 3f 0a 2a 2f 0a 73  <state-db>?.*/.s
1520: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1530: 71 6c 69 74 65 33 72 62 75 28 0a 20 20 43 6c 69  qlite3rbu(.  Cli
1540: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1550: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1560: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1570: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1580: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1590: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
15a0: 52 62 75 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Rbu = 0;.  const
15b0: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 63   char *zCmd;.  c
15c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
15d0: 65 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  et;.  const char
15e0: 20 2a 7a 52 62 75 3b 0a 20 20 63 6f 6e 73 74 20   *zRbu;.  const 
15f0: 63 68 61 72 20 2a 7a 53 74 61 74 65 44 62 20 3d  char *zStateDb =
1600: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
1610: 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35 20 29 7b  =4 && objc!=5 ){
1620: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1630: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1640: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 54 41 52   objv, "NAME TAR
1650: 47 45 54 2d 44 42 20 52 42 55 2d 44 42 20 3f 53  GET-DB RBU-DB ?S
1660: 54 41 54 45 2d 44 42 3f 22 29 3b 0a 20 20 20 20  TATE-DB?");.    
1670: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1680: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 54  ;.  }.  zCmd = T
1690: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16a0: 76 5b 31 5d 29 3b 0a 20 20 7a 54 61 72 67 65 74  v[1]);.  zTarget
16b0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16c0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 52 62  (objv[2]);.  zRb
16d0: 75 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  u = Tcl_GetStrin
16e0: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66  g(objv[3]);.  if
16f0: 28 20 6f 62 6a 63 3d 3d 35 20 29 20 7a 53 74 61  ( objc==5 ) zSta
1700: 74 65 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  teDb = Tcl_GetSt
1710: 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a  ring(objv[4]);..
1720: 20 20 70 52 62 75 20 3d 20 73 71 6c 69 74 65 33    pRbu = sqlite3
1730: 72 62 75 5f 6f 70 65 6e 28 7a 54 61 72 67 65 74  rbu_open(zTarget
1740: 2c 20 7a 52 62 75 2c 20 7a 53 74 61 74 65 44 62  , zRbu, zStateDb
1750: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
1760: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
1770: 2c 20 7a 43 6d 64 2c 20 74 65 73 74 5f 73 71 6c  , zCmd, test_sql
1780: 69 74 65 33 72 62 75 5f 63 6d 64 2c 20 28 43 6c  ite3rbu_cmd, (Cl
1790: 69 65 6e 74 44 61 74 61 29 70 52 62 75 2c 20 30  ientData)pRbu, 0
17a0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
17b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
17c0: 6a 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e  jv[1]);.  return
17d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17e0: 2a 20 54 63 6c 63 6d 64 3a 20 73 71 6c 69 74 65  * Tclcmd: sqlite
17f0: 33 72 62 75 5f 76 61 63 75 75 6d 20 43 4d 44 20  3rbu_vacuum CMD 
1800: 3c 74 61 72 67 65 74 2d 64 62 3e 20 3c 73 74 61  <target-db> <sta
1810: 74 65 2d 64 62 3e 0a 2a 2f 0a 73 74 61 74 69 63  te-db>.*/.static
1820: 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
1830: 33 72 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 43  3rbu_vacuum(.  C
1840: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1850: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1860: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1870: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1880: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1890: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
18a0: 2a 70 52 62 75 20 3d 20 30 3b 0a 20 20 63 6f 6e  *pRbu = 0;.  con
18b0: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20  st char *zCmd;. 
18c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
18d0: 72 67 65 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rget;.  const ch
18e0: 61 72 20 2a 7a 53 74 61 74 65 44 62 20 3d 20 30  ar *zStateDb = 0
18f0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
1900: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1910: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1920: 20 31 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   1, objv, "NAME 
1930: 54 41 52 47 45 54 2d 44 42 20 53 54 41 54 45 2d  TARGET-DB STATE-
1940: 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
1950: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1960: 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74    zCmd = Tcl_Get
1970: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
1980: 0a 20 20 7a 54 61 72 67 65 74 20 3d 20 54 63 6c  .  zTarget = Tcl
1990: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19a0: 32 5d 29 3b 0a 20 20 7a 53 74 61 74 65 44 62 20  2]);.  zStateDb 
19b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
19c0: 6f 62 6a 76 5b 33 5d 29 3b 0a 0a 20 20 70 52 62  objv[3]);..  pRb
19d0: 75 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 76  u = sqlite3rbu_v
19e0: 61 63 75 75 6d 28 7a 54 61 72 67 65 74 2c 20 7a  acuum(zTarget, z
19f0: 53 74 61 74 65 44 62 29 3b 0a 20 20 54 63 6c 5f  StateDb);.  Tcl_
1a00: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1a10: 28 69 6e 74 65 72 70 2c 20 7a 43 6d 64 2c 20 74  (interp, zCmd, t
1a20: 65 73 74 5f 73 71 6c 69 74 65 33 72 62 75 5f 63  est_sqlite3rbu_c
1a30: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
1a40: 70 52 62 75 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  pRbu, 0);.  Tcl_
1a50: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1a60: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a 20  erp, objv[1]);. 
1a70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a  }../*.** Tclcmd:
1a90: 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
1aa0: 74 65 5f 76 66 73 20 3f 2d 64 65 66 61 75 6c 74  te_vfs ?-default
1ab0: 3f 20 4e 41 4d 45 20 50 41 52 45 4e 54 0a 2a 2f  ? NAME PARENT.*/
1ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ad0: 5f 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61  _sqlite3rbu_crea
1ae0: 74 65 5f 76 66 73 28 0a 20 20 43 6c 69 65 6e 74  te_vfs(.  Client
1af0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1b00: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b10: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b20: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b30: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1b50: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
1b60: 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20  *zParent;.  int 
1b70: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1b80: 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
1b90: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1ba0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1bb0: 20 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75 6c   objv, "?-defaul
1bc0: 74 3f 20 4e 41 4d 45 20 50 41 52 45 4e 54 22 29  t? NAME PARENT")
1bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1be0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
1bf0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
1c00: 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
1c10: 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20  ]);.  zParent = 
1c20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c30: 6a 76 5b 6f 62 6a 63 2d 31 5d 29 3b 0a 20 20 69  jv[objc-1]);.  i
1c40: 66 28 20 7a 50 61 72 65 6e 74 5b 30 5d 3d 3d 27  f( zParent[0]=='
1c50: 5c 30 27 20 29 20 7a 50 61 72 65 6e 74 20 3d 20  \0' ) zParent = 
1c60: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
1c70: 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
1c80: 28 7a 4e 61 6d 65 2c 20 7a 50 61 72 65 6e 74 29  (zName, zParent)
1c90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
1cb0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1cc0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1cd0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
1ce0: 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
1cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d00: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
1d10: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
1d20: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1d30: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1d40: 73 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a 20  s_find(zName);. 
1d50: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1d60: 65 67 69 73 74 65 72 28 70 56 66 73 2c 20 31 29  egister(pVfs, 1)
1d70: 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73  ;.  }..  Tcl_Res
1d80: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1d90: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1da0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63  K;.}../*.** Tclc
1db0: 6d 64 3a 20 73 71 6c 69 74 65 33 72 62 75 5f 64  md: sqlite3rbu_d
1dc0: 65 73 74 72 6f 79 5f 76 66 73 20 4e 41 4d 45 0a  estroy_vfs NAME.
1dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1de0: 73 74 5f 73 71 6c 69 74 65 33 72 62 75 5f 64 65  st_sqlite3rbu_de
1df0: 73 74 72 6f 79 5f 76 66 73 28 0a 20 20 43 6c 69  stroy_vfs(.  Cli
1e00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1e10: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e20: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e30: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e40: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e60: 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Name;..  if( obj
1e70: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1e80: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1e90: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 1, objv, "N
1ea0: 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
1eb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ec0: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f  ..  zName = Tcl_
1ed0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ee0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  ]);.  sqlite3rbu
1ef0: 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 7a 4e 61  _destroy_vfs(zNa
1f00: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  me);.  return TC
1f10: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1f20: 63 6c 63 6d 64 3a 20 73 71 6c 69 74 65 33 72 62  clcmd: sqlite3rb
1f30: 75 5f 69 6e 74 65 72 6e 61 6c 5f 74 65 73 74 0a  u_internal_test.
1f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f50: 73 74 5f 73 71 6c 69 74 65 33 72 62 75 5f 69 6e  st_sqlite3rbu_in
1f60: 74 65 72 6e 61 6c 5f 74 65 73 74 28 0a 20 20 43  ternal_test(.  C
1f70: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1f80: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f90: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fa0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fb0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1fd0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ;..  if( objc!=1
1fe0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1ff0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2000: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
2010: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2020: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 62 20 3d  ROR;.  }..  db =
2030: 20 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 30   sqlite3rbu_db(0
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 21 3d  , 0);.  if( db!=
2050: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
2060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2070: 2c 20 22 73 71 6c 69 74 65 33 72 62 75 5f 64 62  , "sqlite3rbu_db
2080: 28 30 2c 20 30 29 21 3d 30 22 2c 20 30 29 3b 0a  (0, 0)!=0", 0);.
2090: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20a0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
20b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69  urn TCL_OK;.}..i
20c0: 6e 74 20 53 71 6c 69 74 65 52 62 75 5f 49 6e 69  nt SqliteRbu_Ini
20d0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
20e0: 74 65 72 70 29 7b 20 0a 20 20 73 74 61 74 69 63  terp){ .  static
20f0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
2100: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2110: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
2120: 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 4f 62 6a  *xProc;.  } aObj
2130: 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Cmd[] = {.    { 
2140: 22 73 71 6c 69 74 65 33 72 62 75 22 2c 20 74 65  "sqlite3rbu", te
2150: 73 74 5f 73 71 6c 69 74 65 33 72 62 75 20 7d 2c  st_sqlite3rbu },
2160: 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 72  .    { "sqlite3r
2170: 62 75 5f 76 61 63 75 75 6d 22 2c 20 74 65 73 74  bu_vacuum", test
2180: 5f 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75  _sqlite3rbu_vacu
2190: 75 6d 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c  um },.    { "sql
21a0: 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
21b0: 66 73 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65  fs", test_sqlite
21c0: 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 20  3rbu_create_vfs 
21d0: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
21e0: 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
21f0: 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33 72  ", test_sqlite3r
2200: 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 20 7d  bu_destroy_vfs }
2210: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  ,.    { "sqlite3
2220: 72 62 75 5f 69 6e 74 65 72 6e 61 6c 5f 74 65 73  rbu_internal_tes
2230: 74 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33  t", test_sqlite3
2240: 72 62 75 5f 69 6e 74 65 72 6e 61 6c 5f 74 65 73  rbu_internal_tes
2250: 74 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  t },.  };.  int 
2260: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2270: 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f  sizeof(aObjCmd)/
2280: 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30  sizeof(aObjCmd[0
2290: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
22a0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
22b0: 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43  nd(interp, aObjC
22c0: 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f 62  md[i].zName, aOb
22d0: 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  jCmd[i].xProc, 0
22e0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
22f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65  rn TCL_OK;.}..#e
2300: 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63  lse.#include <tc
2310: 6c 2e 68 3e 0a 69 6e 74 20 53 71 6c 69 74 65 52  l.h>.int SqliteR
2320: 62 75 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  bu_Init(Tcl_Inte
2330: 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
2340: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
2350: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2360: 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c  (SQLITE_CORE) ||
2370: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2380: 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a 23  ENABLE_RBU) */.#
2390: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
23a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f  (SQLITE_TEST) */
23b0: 0a                                               .