Annotation of embedaddon/sqlite3/src/test_backup.c, revision 1.1.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>