Annotation of embedaddon/sqlite3/src/test_backup.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2009 January 28
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains test logic for the sqlite3_backup() interface.
! 13: **
! 14: */
! 15:
! 16: #include "tcl.h"
! 17: #include <sqlite3.h>
! 18: #include <assert.h>
! 19:
! 20: /* These functions are implemented in test1.c. */
! 21: int getDbPointer(Tcl_Interp *, const char *, sqlite3 **);
! 22: const char *sqlite3TestErrorName(int);
! 23:
! 24: static int backupTestCmd(
! 25: ClientData clientData,
! 26: Tcl_Interp *interp,
! 27: int objc,
! 28: Tcl_Obj *const*objv
! 29: ){
! 30: enum BackupSubCommandEnum {
! 31: BACKUP_STEP, BACKUP_FINISH, BACKUP_REMAINING, BACKUP_PAGECOUNT
! 32: };
! 33: struct BackupSubCommand {
! 34: const char *zCmd;
! 35: enum BackupSubCommandEnum eCmd;
! 36: int nArg;
! 37: const char *zArg;
! 38: } aSub[] = {
! 39: {"step", BACKUP_STEP , 1, "npage" },
! 40: {"finish", BACKUP_FINISH , 0, "" },
! 41: {"remaining", BACKUP_REMAINING , 0, "" },
! 42: {"pagecount", BACKUP_PAGECOUNT , 0, "" },
! 43: {0, 0, 0, 0}
! 44: };
! 45:
! 46: sqlite3_backup *p = (sqlite3_backup *)clientData;
! 47: int iCmd;
! 48: int rc;
! 49:
! 50: rc = Tcl_GetIndexFromObjStruct(
! 51: interp, objv[1], aSub, sizeof(aSub[0]), "option", 0, &iCmd
! 52: );
! 53: if( rc!=TCL_OK ){
! 54: return rc;
! 55: }
! 56: if( objc!=(2 + aSub[iCmd].nArg) ){
! 57: Tcl_WrongNumArgs(interp, 2, objv, aSub[iCmd].zArg);
! 58: return TCL_ERROR;
! 59: }
! 60:
! 61: switch( aSub[iCmd].eCmd ){
! 62:
! 63: case BACKUP_FINISH: {
! 64: const char *zCmdName;
! 65: Tcl_CmdInfo cmdInfo;
! 66: zCmdName = Tcl_GetString(objv[0]);
! 67: Tcl_GetCommandInfo(interp, zCmdName, &cmdInfo);
! 68: cmdInfo.deleteProc = 0;
! 69: Tcl_SetCommandInfo(interp, zCmdName, &cmdInfo);
! 70: Tcl_DeleteCommand(interp, zCmdName);
! 71:
! 72: rc = sqlite3_backup_finish(p);
! 73: Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC);
! 74: break;
! 75: }
! 76:
! 77: case BACKUP_STEP: {
! 78: int nPage;
! 79: if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &nPage) ){
! 80: return TCL_ERROR;
! 81: }
! 82: rc = sqlite3_backup_step(p, nPage);
! 83: Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC);
! 84: break;
! 85: }
! 86:
! 87: case BACKUP_REMAINING:
! 88: Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_remaining(p)));
! 89: break;
! 90:
! 91: case BACKUP_PAGECOUNT:
! 92: Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_pagecount(p)));
! 93: break;
! 94: }
! 95:
! 96: return TCL_OK;
! 97: }
! 98:
! 99: static void backupTestFinish(ClientData clientData){
! 100: sqlite3_backup *pBackup = (sqlite3_backup *)clientData;
! 101: sqlite3_backup_finish(pBackup);
! 102: }
! 103:
! 104: /*
! 105: ** sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME
! 106: **
! 107: */
! 108: static int backupTestInit(
! 109: ClientData clientData,
! 110: Tcl_Interp *interp,
! 111: int objc,
! 112: Tcl_Obj *const*objv
! 113: ){
! 114: sqlite3_backup *pBackup;
! 115: sqlite3 *pDestDb;
! 116: sqlite3 *pSrcDb;
! 117: const char *zDestName;
! 118: const char *zSrcName;
! 119: const char *zCmd;
! 120:
! 121: if( objc!=6 ){
! 122: Tcl_WrongNumArgs(
! 123: interp, 1, objv, "CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME"
! 124: );
! 125: return TCL_ERROR;
! 126: }
! 127:
! 128: zCmd = Tcl_GetString(objv[1]);
! 129: getDbPointer(interp, Tcl_GetString(objv[2]), &pDestDb);
! 130: zDestName = Tcl_GetString(objv[3]);
! 131: getDbPointer(interp, Tcl_GetString(objv[4]), &pSrcDb);
! 132: zSrcName = Tcl_GetString(objv[5]);
! 133:
! 134: pBackup = sqlite3_backup_init(pDestDb, zDestName, pSrcDb, zSrcName);
! 135: if( !pBackup ){
! 136: Tcl_AppendResult(interp, "sqlite3_backup_init() failed", 0);
! 137: return TCL_ERROR;
! 138: }
! 139:
! 140: Tcl_CreateObjCommand(interp, zCmd, backupTestCmd, pBackup, backupTestFinish);
! 141: Tcl_SetObjResult(interp, objv[1]);
! 142: return TCL_OK;
! 143: }
! 144:
! 145: int Sqlitetestbackup_Init(Tcl_Interp *interp){
! 146: Tcl_CreateObjCommand(interp, "sqlite3_backup", backupTestInit, 0, 0);
! 147: return TCL_OK;
! 148: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>