151 lines
3.8 KiB
C
151 lines
3.8 KiB
C
|
/*
|
||
|
** 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;
|
||
|
}
|