xref: /sqlite-3.40.0/src/test_backup.c (revision 7617e4a8)
10410302eSdanielk1977 /*
20410302eSdanielk1977 ** 2009 January 28
30410302eSdanielk1977 **
40410302eSdanielk1977 ** The author disclaims copyright to this source code.  In place of
50410302eSdanielk1977 ** a legal notice, here is a blessing:
60410302eSdanielk1977 **
70410302eSdanielk1977 **    May you do good and not evil.
80410302eSdanielk1977 **    May you find forgiveness for yourself and forgive others.
90410302eSdanielk1977 **    May you share freely, never taking more than you give.
100410302eSdanielk1977 **
110410302eSdanielk1977 *************************************************************************
12c81c11f6Sdrh ** This file contains test logic for the sqlite3_backup() interface.
130410302eSdanielk1977 **
140410302eSdanielk1977 */
150410302eSdanielk1977 
1652b1dbb5Smistachkin #if defined(INCLUDE_SQLITE_TCL_H)
1752b1dbb5Smistachkin #  include "sqlite_tcl.h"
1852b1dbb5Smistachkin #else
190410302eSdanielk1977 #  include "tcl.h"
20*7617e4a8Smistachkin #  ifndef SQLITE_TCLAPI
21*7617e4a8Smistachkin #    define SQLITE_TCLAPI
22*7617e4a8Smistachkin #  endif
2352b1dbb5Smistachkin #endif
24883ad049Sdrh #include "sqlite3.h"
250410302eSdanielk1977 #include <assert.h>
260410302eSdanielk1977 
27e84d8d32Smistachkin /* These functions are implemented in main.c. */
28e84d8d32Smistachkin extern const char *sqlite3ErrName(int);
29e84d8d32Smistachkin 
300410302eSdanielk1977 /* These functions are implemented in test1.c. */
31e84d8d32Smistachkin extern int getDbPointer(Tcl_Interp *, const char *, sqlite3 **);
320410302eSdanielk1977 
backupTestCmd(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * const * objv)33*7617e4a8Smistachkin static int SQLITE_TCLAPI backupTestCmd(
340410302eSdanielk1977   ClientData clientData,
350410302eSdanielk1977   Tcl_Interp *interp,
360410302eSdanielk1977   int objc,
370410302eSdanielk1977   Tcl_Obj *const*objv
380410302eSdanielk1977 ){
390410302eSdanielk1977   enum BackupSubCommandEnum {
400410302eSdanielk1977     BACKUP_STEP, BACKUP_FINISH, BACKUP_REMAINING, BACKUP_PAGECOUNT
410410302eSdanielk1977   };
420410302eSdanielk1977   struct BackupSubCommand {
430410302eSdanielk1977     const char *zCmd;
440410302eSdanielk1977     enum BackupSubCommandEnum eCmd;
450410302eSdanielk1977     int nArg;
460410302eSdanielk1977     const char *zArg;
470410302eSdanielk1977   } aSub[] = {
480410302eSdanielk1977     {"step",      BACKUP_STEP      , 1, "npage" },
490410302eSdanielk1977     {"finish",    BACKUP_FINISH    , 0, ""      },
500410302eSdanielk1977     {"remaining", BACKUP_REMAINING , 0, ""      },
510410302eSdanielk1977     {"pagecount", BACKUP_PAGECOUNT , 0, ""      },
520410302eSdanielk1977     {0, 0, 0, 0}
530410302eSdanielk1977   };
540410302eSdanielk1977 
550410302eSdanielk1977   sqlite3_backup *p = (sqlite3_backup *)clientData;
560410302eSdanielk1977   int iCmd;
570410302eSdanielk1977   int rc;
580410302eSdanielk1977 
590410302eSdanielk1977   rc = Tcl_GetIndexFromObjStruct(
600410302eSdanielk1977       interp, objv[1], aSub, sizeof(aSub[0]), "option", 0, &iCmd
610410302eSdanielk1977   );
620410302eSdanielk1977   if( rc!=TCL_OK ){
630410302eSdanielk1977     return rc;
640410302eSdanielk1977   }
650410302eSdanielk1977   if( objc!=(2 + aSub[iCmd].nArg) ){
660410302eSdanielk1977     Tcl_WrongNumArgs(interp, 2, objv, aSub[iCmd].zArg);
670410302eSdanielk1977     return TCL_ERROR;
680410302eSdanielk1977   }
690410302eSdanielk1977 
700410302eSdanielk1977   switch( aSub[iCmd].eCmd ){
710410302eSdanielk1977 
720410302eSdanielk1977     case BACKUP_FINISH: {
7352b9c53fSdrh       const char *zCmdName;
740410302eSdanielk1977       Tcl_CmdInfo cmdInfo;
7552b9c53fSdrh       zCmdName = Tcl_GetString(objv[0]);
7652b9c53fSdrh       Tcl_GetCommandInfo(interp, zCmdName, &cmdInfo);
770410302eSdanielk1977       cmdInfo.deleteProc = 0;
7852b9c53fSdrh       Tcl_SetCommandInfo(interp, zCmdName, &cmdInfo);
7952b9c53fSdrh       Tcl_DeleteCommand(interp, zCmdName);
800410302eSdanielk1977 
810410302eSdanielk1977       rc = sqlite3_backup_finish(p);
82e84d8d32Smistachkin       Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);
830410302eSdanielk1977       break;
840410302eSdanielk1977     }
850410302eSdanielk1977 
860410302eSdanielk1977     case BACKUP_STEP: {
870410302eSdanielk1977       int nPage;
880410302eSdanielk1977       if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &nPage) ){
890410302eSdanielk1977         return TCL_ERROR;
900410302eSdanielk1977       }
910410302eSdanielk1977       rc = sqlite3_backup_step(p, nPage);
92e84d8d32Smistachkin       Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);
930410302eSdanielk1977       break;
940410302eSdanielk1977     }
950410302eSdanielk1977 
960410302eSdanielk1977     case BACKUP_REMAINING:
970410302eSdanielk1977       Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_remaining(p)));
980410302eSdanielk1977       break;
990410302eSdanielk1977 
1000410302eSdanielk1977     case BACKUP_PAGECOUNT:
1010410302eSdanielk1977       Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_pagecount(p)));
1020410302eSdanielk1977       break;
1030410302eSdanielk1977   }
1040410302eSdanielk1977 
1050410302eSdanielk1977   return TCL_OK;
1060410302eSdanielk1977 }
1070410302eSdanielk1977 
backupTestFinish(ClientData clientData)108*7617e4a8Smistachkin static void SQLITE_TCLAPI backupTestFinish(ClientData clientData){
1090410302eSdanielk1977   sqlite3_backup *pBackup = (sqlite3_backup *)clientData;
1100410302eSdanielk1977   sqlite3_backup_finish(pBackup);
1110410302eSdanielk1977 }
1120410302eSdanielk1977 
1130410302eSdanielk1977 /*
1140410302eSdanielk1977 **     sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME
1150410302eSdanielk1977 **
1160410302eSdanielk1977 */
backupTestInit(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * const * objv)117*7617e4a8Smistachkin static int SQLITE_TCLAPI backupTestInit(
1180410302eSdanielk1977   ClientData clientData,
1190410302eSdanielk1977   Tcl_Interp *interp,
1200410302eSdanielk1977   int objc,
1210410302eSdanielk1977   Tcl_Obj *const*objv
1220410302eSdanielk1977 ){
1230410302eSdanielk1977   sqlite3_backup *pBackup;
1240410302eSdanielk1977   sqlite3 *pDestDb;
1250410302eSdanielk1977   sqlite3 *pSrcDb;
1260410302eSdanielk1977   const char *zDestName;
1270410302eSdanielk1977   const char *zSrcName;
1280410302eSdanielk1977   const char *zCmd;
1290410302eSdanielk1977 
1300410302eSdanielk1977   if( objc!=6 ){
1310410302eSdanielk1977     Tcl_WrongNumArgs(
1320410302eSdanielk1977       interp, 1, objv, "CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME"
1330410302eSdanielk1977     );
1340410302eSdanielk1977     return TCL_ERROR;
1350410302eSdanielk1977   }
1360410302eSdanielk1977 
1370410302eSdanielk1977   zCmd = Tcl_GetString(objv[1]);
1380410302eSdanielk1977   getDbPointer(interp, Tcl_GetString(objv[2]), &pDestDb);
1390410302eSdanielk1977   zDestName = Tcl_GetString(objv[3]);
1400410302eSdanielk1977   getDbPointer(interp, Tcl_GetString(objv[4]), &pSrcDb);
1410410302eSdanielk1977   zSrcName = Tcl_GetString(objv[5]);
1420410302eSdanielk1977 
1430410302eSdanielk1977   pBackup = sqlite3_backup_init(pDestDb, zDestName, pSrcDb, zSrcName);
1440410302eSdanielk1977   if( !pBackup ){
1450410302eSdanielk1977     Tcl_AppendResult(interp, "sqlite3_backup_init() failed", 0);
1460410302eSdanielk1977     return TCL_ERROR;
1470410302eSdanielk1977   }
1480410302eSdanielk1977 
1490410302eSdanielk1977   Tcl_CreateObjCommand(interp, zCmd, backupTestCmd, pBackup, backupTestFinish);
1500410302eSdanielk1977   Tcl_SetObjResult(interp, objv[1]);
1510410302eSdanielk1977   return TCL_OK;
1520410302eSdanielk1977 }
1530410302eSdanielk1977 
Sqlitetestbackup_Init(Tcl_Interp * interp)1540410302eSdanielk1977 int Sqlitetestbackup_Init(Tcl_Interp *interp){
1550410302eSdanielk1977   Tcl_CreateObjCommand(interp, "sqlite3_backup", backupTestInit, 0, 0);
1560410302eSdanielk1977   return TCL_OK;
1570410302eSdanielk1977 }
158