| /* |
| ** 2009 January 28 |
| ** |
| ** The author disclaims copyright to this source code. In place of |
| ** a legal notice, here is a blessing: |
| ** |
| ** May you do good and not evil. |
| ** May you find forgiveness for yourself and forgive others. |
| ** May you share freely, never taking more than you give. |
| ** |
| ************************************************************************* |
| ** This file contains test logic for the sqlite3_backup() interface. |
| ** |
| */ |
| |
| #if defined(INCLUDE_SQLITE_TCL_H) |
| # include "sqlite_tcl.h" |
| #else |
| # include "tcl.h" |
| # ifndef SQLITE_TCLAPI |
| # define SQLITE_TCLAPI |
| # endif |
| #endif |
| #include "sqlite3.h" |
| #include <assert.h> |
| |
| /* These functions are implemented in main.c. */ |
| extern const char *sqlite3ErrName(int); |
| |
| /* These functions are implemented in test1.c. */ |
| extern int getDbPointer(Tcl_Interp *, const char *, sqlite3 **); |
| |
| static int SQLITE_TCLAPI backupTestCmd( |
| ClientData clientData, |
| Tcl_Interp *interp, |
| int objc, |
| Tcl_Obj *const*objv |
| ){ |
| enum BackupSubCommandEnum { |
| BACKUP_STEP, BACKUP_FINISH, BACKUP_REMAINING, BACKUP_PAGECOUNT |
| }; |
| struct BackupSubCommand { |
| const char *zCmd; |
| enum BackupSubCommandEnum eCmd; |
| int nArg; |
| const char *zArg; |
| } aSub[] = { |
| {"step", BACKUP_STEP , 1, "npage" }, |
| {"finish", BACKUP_FINISH , 0, "" }, |
| {"remaining", BACKUP_REMAINING , 0, "" }, |
| {"pagecount", BACKUP_PAGECOUNT , 0, "" }, |
| {0, 0, 0, 0} |
| }; |
| |
| sqlite3_backup *p = (sqlite3_backup *)clientData; |
| int iCmd; |
| int rc; |
| |
| rc = Tcl_GetIndexFromObjStruct( |
| interp, objv[1], aSub, sizeof(aSub[0]), "option", 0, &iCmd |
| ); |
| if( rc!=TCL_OK ){ |
| return rc; |
| } |
| if( objc!=(2 + aSub[iCmd].nArg) ){ |
| Tcl_WrongNumArgs(interp, 2, objv, aSub[iCmd].zArg); |
| return TCL_ERROR; |
| } |
| |
| switch( aSub[iCmd].eCmd ){ |
| |
| case BACKUP_FINISH: { |
| const char *zCmdName; |
| Tcl_CmdInfo cmdInfo; |
| zCmdName = Tcl_GetString(objv[0]); |
| Tcl_GetCommandInfo(interp, zCmdName, &cmdInfo); |
| cmdInfo.deleteProc = 0; |
| Tcl_SetCommandInfo(interp, zCmdName, &cmdInfo); |
| Tcl_DeleteCommand(interp, zCmdName); |
| |
| rc = sqlite3_backup_finish(p); |
| Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC); |
| break; |
| } |
| |
| case BACKUP_STEP: { |
| int nPage; |
| if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &nPage) ){ |
| return TCL_ERROR; |
| } |
| rc = sqlite3_backup_step(p, nPage); |
| Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC); |
| break; |
| } |
| |
| case BACKUP_REMAINING: |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_remaining(p))); |
| break; |
| |
| case BACKUP_PAGECOUNT: |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_pagecount(p))); |
| break; |
| } |
| |
| return TCL_OK; |
| } |
| |
| static void SQLITE_TCLAPI backupTestFinish(ClientData clientData){ |
| sqlite3_backup *pBackup = (sqlite3_backup *)clientData; |
| sqlite3_backup_finish(pBackup); |
| } |
| |
| /* |
| ** sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME |
| ** |
| */ |
| static int SQLITE_TCLAPI backupTestInit( |
| ClientData clientData, |
| Tcl_Interp *interp, |
| int objc, |
| Tcl_Obj *const*objv |
| ){ |
| sqlite3_backup *pBackup; |
| sqlite3 *pDestDb; |
| sqlite3 *pSrcDb; |
| const char *zDestName; |
| const char *zSrcName; |
| const char *zCmd; |
| |
| if( objc!=6 ){ |
| Tcl_WrongNumArgs( |
| interp, 1, objv, "CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME" |
| ); |
| return TCL_ERROR; |
| } |
| |
| zCmd = Tcl_GetString(objv[1]); |
| getDbPointer(interp, Tcl_GetString(objv[2]), &pDestDb); |
| zDestName = Tcl_GetString(objv[3]); |
| getDbPointer(interp, Tcl_GetString(objv[4]), &pSrcDb); |
| zSrcName = Tcl_GetString(objv[5]); |
| |
| pBackup = sqlite3_backup_init(pDestDb, zDestName, pSrcDb, zSrcName); |
| if( !pBackup ){ |
| Tcl_AppendResult(interp, "sqlite3_backup_init() failed", 0); |
| return TCL_ERROR; |
| } |
| |
| Tcl_CreateObjCommand(interp, zCmd, backupTestCmd, pBackup, backupTestFinish); |
| Tcl_SetObjResult(interp, objv[1]); |
| return TCL_OK; |
| } |
| |
| int Sqlitetestbackup_Init(Tcl_Interp *interp){ |
| Tcl_CreateObjCommand(interp, "sqlite3_backup", backupTestInit, 0, 0); |
| return TCL_OK; |
| } |