1
0

test_backup.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. #include "tcl.h"
  16. #include <sqlite3.h>
  17. #include <assert.h>
  18. /* These functions are implemented in main.c. */
  19. extern const char *sqlite3ErrName(int);
  20. /* These functions are implemented in test1.c. */
  21. extern int getDbPointer(Tcl_Interp *, const char *, sqlite3 **);
  22. static int backupTestCmd(
  23. ClientData clientData,
  24. Tcl_Interp *interp,
  25. int objc,
  26. Tcl_Obj *const*objv
  27. ){
  28. enum BackupSubCommandEnum {
  29. BACKUP_STEP, BACKUP_FINISH, BACKUP_REMAINING, BACKUP_PAGECOUNT
  30. };
  31. struct BackupSubCommand {
  32. const char *zCmd;
  33. enum BackupSubCommandEnum eCmd;
  34. int nArg;
  35. const char *zArg;
  36. } aSub[] = {
  37. {"step", BACKUP_STEP , 1, "npage" },
  38. {"finish", BACKUP_FINISH , 0, "" },
  39. {"remaining", BACKUP_REMAINING , 0, "" },
  40. {"pagecount", BACKUP_PAGECOUNT , 0, "" },
  41. {0, 0, 0, 0}
  42. };
  43. sqlite3_backup *p = (sqlite3_backup *)clientData;
  44. int iCmd;
  45. int rc;
  46. rc = Tcl_GetIndexFromObjStruct(
  47. interp, objv[1], aSub, sizeof(aSub[0]), "option", 0, &iCmd
  48. );
  49. if( rc!=TCL_OK ){
  50. return rc;
  51. }
  52. if( objc!=(2 + aSub[iCmd].nArg) ){
  53. Tcl_WrongNumArgs(interp, 2, objv, aSub[iCmd].zArg);
  54. return TCL_ERROR;
  55. }
  56. switch( aSub[iCmd].eCmd ){
  57. case BACKUP_FINISH: {
  58. const char *zCmdName;
  59. Tcl_CmdInfo cmdInfo;
  60. zCmdName = Tcl_GetString(objv[0]);
  61. Tcl_GetCommandInfo(interp, zCmdName, &cmdInfo);
  62. cmdInfo.deleteProc = 0;
  63. Tcl_SetCommandInfo(interp, zCmdName, &cmdInfo);
  64. Tcl_DeleteCommand(interp, zCmdName);
  65. rc = sqlite3_backup_finish(p);
  66. Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);
  67. break;
  68. }
  69. case BACKUP_STEP: {
  70. int nPage;
  71. if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &nPage) ){
  72. return TCL_ERROR;
  73. }
  74. rc = sqlite3_backup_step(p, nPage);
  75. Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_STATIC);
  76. break;
  77. }
  78. case BACKUP_REMAINING:
  79. Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_remaining(p)));
  80. break;
  81. case BACKUP_PAGECOUNT:
  82. Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_backup_pagecount(p)));
  83. break;
  84. }
  85. return TCL_OK;
  86. }
  87. static void backupTestFinish(ClientData clientData){
  88. sqlite3_backup *pBackup = (sqlite3_backup *)clientData;
  89. sqlite3_backup_finish(pBackup);
  90. }
  91. /*
  92. ** sqlite3_backup CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME
  93. **
  94. */
  95. static int backupTestInit(
  96. ClientData clientData,
  97. Tcl_Interp *interp,
  98. int objc,
  99. Tcl_Obj *const*objv
  100. ){
  101. sqlite3_backup *pBackup;
  102. sqlite3 *pDestDb;
  103. sqlite3 *pSrcDb;
  104. const char *zDestName;
  105. const char *zSrcName;
  106. const char *zCmd;
  107. if( objc!=6 ){
  108. Tcl_WrongNumArgs(
  109. interp, 1, objv, "CMDNAME DESTHANDLE DESTNAME SRCHANDLE SRCNAME"
  110. );
  111. return TCL_ERROR;
  112. }
  113. zCmd = Tcl_GetString(objv[1]);
  114. getDbPointer(interp, Tcl_GetString(objv[2]), &pDestDb);
  115. zDestName = Tcl_GetString(objv[3]);
  116. getDbPointer(interp, Tcl_GetString(objv[4]), &pSrcDb);
  117. zSrcName = Tcl_GetString(objv[5]);
  118. pBackup = sqlite3_backup_init(pDestDb, zDestName, pSrcDb, zSrcName);
  119. if( !pBackup ){
  120. Tcl_AppendResult(interp, "sqlite3_backup_init() failed", 0);
  121. return TCL_ERROR;
  122. }
  123. Tcl_CreateObjCommand(interp, zCmd, backupTestCmd, pBackup, backupTestFinish);
  124. Tcl_SetObjResult(interp, objv[1]);
  125. return TCL_OK;
  126. }
  127. int Sqlitetestbackup_Init(Tcl_Interp *interp){
  128. Tcl_CreateObjCommand(interp, "sqlite3_backup", backupTestInit, 0, 0);
  129. return TCL_OK;
  130. }