| OLD | NEW | 
 | (Empty) | 
|    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 ** |  | 
|   13 ** $Id: test_backup.c,v 1.3 2009/03/30 12:56:52 drh Exp $ |  | 
|   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 } |  | 
| OLD | NEW |