123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- ** 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.
- **
- */
- #include "tcl.h"
- #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 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 backupTestFinish(ClientData clientData){
- sqlite3_backup *pBackup = (sqlite3_backup *)clientData;
- sqlite3_backup_finish(pBackup);
- }
- /*
- ** sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME
- **
- */
- static int 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;
- }
|