File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / src / test_backup.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:17 2012 UTC (12 years, 7 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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>