Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
test_backup.c151 linesDownload Raw Back to src
1/*2** 2009 January 283**4** The author disclaims copyright to this source code.  In place of5** 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 "tclsqlite.h"17#include "sqlite3.h"18#include <assert.h>19 20/* These functions are implemented in main.c. */21extern const char *sqlite3ErrName(int);22 23/* These functions are implemented in test1.c. */24extern int getDbPointer(Tcl_Interp *, const char *, sqlite3 **);25 26static int SQLITE_TCLAPI backupTestCmd(27  ClientData clientData, 28  Tcl_Interp *interp, 29  int objc,30  Tcl_Obj *const*objv31){32  enum BackupSubCommandEnum {33    BACKUP_STEP, BACKUP_FINISH, BACKUP_REMAINING, BACKUP_PAGECOUNT34  };35  struct BackupSubCommand {36    const char *zCmd;37    enum BackupSubCommandEnum eCmd;38    int nArg;39    const char *zArg;40  } aSub[] = {41    {"step",      BACKUP_STEP      , 1, "npage" },42    {"finish",    BACKUP_FINISH    , 0, ""      },43    {"remaining", BACKUP_REMAINING , 0, ""      },44    {"pagecount", BACKUP_PAGECOUNT , 0, ""      },45    {0, 0, 0, 0}46  };47 48  sqlite3_backup *p = (sqlite3_backup *)clientData;49  int iCmd;50  int rc;51 52  rc = Tcl_GetIndexFromObjStruct(53      interp, objv[1], aSub, sizeof(aSub[0]), "option", 0, &iCmd54  );55  if( rc!=TCL_OK ){56    return rc;57  }58  if( objc!=(2 + aSub[iCmd].nArg) ){59    Tcl_WrongNumArgs(interp, 2, objv, aSub[iCmd].zArg);60    return TCL_ERROR;61  }62 63  switch( aSub[iCmd].eCmd ){64 65    case BACKUP_FINISH: {66      const char *zCmdName;67      Tcl_CmdInfo cmdInfo;68      zCmdName = Tcl_GetString(objv[0]);69      Tcl_GetCommandInfo(interp, zCmdName, &cmdInfo);70      cmdInfo.deleteProc = 0;71      Tcl_SetCommandInfo(interp, zCmdName, &cmdInfo);72      Tcl_DeleteCommand(interp, zCmdName);73 74      rc = sqlite3_backup_finish(p);75      Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);76      break;77    }78 79    case BACKUP_STEP: {80      int nPage;81      if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &nPage) ){82        return TCL_ERROR;83      }84      rc = sqlite3_backup_step(p, nPage);85      Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);86      break;87    }88 89    case BACKUP_REMAINING:90      Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_remaining(p)));91      break;92 93    case BACKUP_PAGECOUNT:94      Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_pagecount(p)));95      break;96  }97 98  return TCL_OK;99}100 101static void SQLITE_TCLAPI backupTestFinish(ClientData clientData){102  sqlite3_backup *pBackup = (sqlite3_backup *)clientData;103  sqlite3_backup_finish(pBackup);104}105 106/*107**     sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME108**109*/110static int SQLITE_TCLAPI backupTestInit(111  ClientData clientData, 112  Tcl_Interp *interp, 113  int objc,114  Tcl_Obj *const*objv115){116  sqlite3_backup *pBackup;117  sqlite3 *pDestDb;118  sqlite3 *pSrcDb;119  const char *zDestName;120  const char *zSrcName;121  const char *zCmd;122 123  if( objc!=6 ){124    Tcl_WrongNumArgs(125      interp, 1, objv, "CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME"126    );127    return TCL_ERROR;128  }129 130  zCmd = Tcl_GetString(objv[1]);131  getDbPointer(interp, Tcl_GetString(objv[2]), &pDestDb);132  zDestName = Tcl_GetString(objv[3]);133  getDbPointer(interp, Tcl_GetString(objv[4]), &pSrcDb);134  zSrcName = Tcl_GetString(objv[5]);135 136  pBackup = sqlite3_backup_init(pDestDb, zDestName, pSrcDb, zSrcName);137  if( !pBackup ){138    Tcl_AppendResult(interp, "sqlite3_backup_init() failed", NULL);139    return TCL_ERROR;140  }141 142  Tcl_CreateObjCommand(interp, zCmd, backupTestCmd, pBackup, backupTestFinish);143  Tcl_SetObjResult(interp, objv[1]);144  return TCL_OK;145}146 147int Sqlitetestbackup_Init(Tcl_Interp *interp){148  Tcl_CreateObjCommand(interp, "sqlite3_backup", backupTestInit, 0, 0);149  return TCL_OK;150}151