summaryrefslogtreecommitdiffstats
path: root/src/test_backup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_backup.c')
-rw-r--r--src/test_backup.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/test_backup.c b/src/test_backup.c
new file mode 100644
index 0000000..9b684a2
--- /dev/null
+++ b/src/test_backup.c
@@ -0,0 +1,157 @@
+/*
+** 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;
+}