Guest User

sqlite3_backup() vs page_size.

a guest
Oct 27th, 2016
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.20 KB | None | 0 0
  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <sqlite3.h>
  5. #include <unistd.h>
  6.  
  7. const char kDstFile[] = "/tmp/dbdst";
  8. const char kSrcFile[] = "/tmp/dbsrc";
  9.  
  10. int sqlite3_append(char** pzBuf, const char* zOtherBuf) {
  11.   size_t nOtherBuf = strlen(zOtherBuf);
  12.   size_t nBuf = *pzBuf ? strlen(*pzBuf) : 0;
  13.   *pzBuf = sqlite3_realloc(*pzBuf, nBuf + nOtherBuf + 1);
  14.   if (!*pzBuf)
  15.     return SQLITE_NOMEM;
  16.   strcpy(*pzBuf + nBuf, zOtherBuf);
  17.   return SQLITE_OK;
  18. }
  19.  
  20. int sqlite3_gather(void* context, int nArgs, char** zArgs, char** zColumns) {
  21.   char** pzOut = (char**)context;
  22.   if (*pzOut && SQLITE_OK != sqlite3_append(pzOut, "\n"))
  23.     return 1;
  24.  
  25.   for (int i = 0; i < nArgs; ++i) {
  26.     if (i && SQLITE_OK != sqlite3_append(pzOut, "|"))
  27.       return 1;
  28.     if (SQLITE_OK != sqlite3_append(pzOut, zArgs[i]))
  29.       return 1;
  30.   }
  31.   return 0;
  32. }
  33.  
  34. int sqlite3_execute(sqlite3* db, const char* zSql) {
  35.   return sqlite3_exec(db, zSql, NULL, NULL, NULL);
  36. }
  37.  
  38. int sqlite3_execute_and_gather(sqlite3* db, const char* zSql, char** pzOut) {
  39.   return sqlite3_exec(db, zSql, sqlite3_gather, pzOut, NULL);
  40. }
  41.  
  42. int main(void) {
  43.   unlink(kDstFile);
  44.   unlink(kSrcFile);
  45.  
  46.   // Create a database with page_size 1024.
  47.   sqlite3* dst = NULL;
  48.   assert(SQLITE_OK == sqlite3_open(kDstFile, &dst));
  49.   assert(SQLITE_OK ==
  50.          sqlite3_execute(dst,
  51.                          "PRAGMA page_size = 1024;"
  52.                          "CREATE TABLE t (c);"
  53.                          "INSERT INTO t VALUES ('a');"
  54.                          "INSERT INTO t VALUES ('b');"
  55.                          "INSERT INTO t VALUES ('c');"
  56.                          "INSERT INTO t VALUES ('d');"
  57.                          ));
  58.   char* zResults = NULL;
  59.   assert(SQLITE_OK == sqlite3_execute_and_gather(dst, "PRAGMA page_size", &zResults));
  60.   assert(!strcmp("1024", zResults));
  61.   sqlite3_free(zResults);
  62.   zResults = NULL;
  63.  
  64.   // Changing the page_size does not change the page size.
  65.   assert(SQLITE_OK == sqlite3_open(kDstFile, &dst));
  66.   assert(SQLITE_OK == sqlite3_execute(dst, "PRAGMA page_size = 4096"));
  67.   assert(SQLITE_OK == sqlite3_execute_and_gather(dst, "PRAGMA page_size", &zResults));
  68.   assert(!strcmp("1024", zResults));
  69.   sqlite3_free(zResults);
  70.   zResults = NULL;
  71.  
  72.   // Create another database with page_size 4096.
  73.   sqlite3* src = NULL;
  74.   assert(SQLITE_OK == sqlite3_open(kSrcFile, &src));
  75.   assert(SQLITE_OK ==
  76.          sqlite3_execute(src,
  77.                          "PRAGMA page_size = 4096;"
  78.                          "CREATE TABLE t (c);"
  79.                          "INSERT INTO t VALUES ('e');"
  80.                          "INSERT INTO t VALUES ('f');"
  81.                          "INSERT INTO t VALUES ('g');"
  82.                          "INSERT INTO t VALUES ('h');"
  83.                          ));
  84.   assert(SQLITE_OK == sqlite3_execute_and_gather(src, "PRAGMA page_size", &zResults));
  85.   assert(!strcmp("4096", zResults));
  86.   sqlite3_free(zResults);
  87.   zResults = NULL;
  88.  
  89.   // Backup src over dst.  Both should end up with the same page_size of 4096.
  90.   sqlite3_backup* backup = sqlite3_backup_init(dst, "main", src, "main");
  91.   assert(backup);
  92.   assert(SQLITE_DONE == sqlite3_backup_step(backup, -1));
  93.   assert(SQLITE_OK == sqlite3_backup_finish(backup));
  94.  
  95.   // The dst page_size stayed at 1024?
  96.   assert(SQLITE_OK == sqlite3_execute_and_gather(dst, "PRAGMA page_size", &zResults));
  97.   assert(!strcmp("1024", zResults));
  98.   sqlite3_free(zResults);
  99.   zResults = NULL;
  100.  
  101.   // But the data in dst is from src.
  102.   assert(SQLITE_OK == sqlite3_execute_and_gather(dst, "SELECT * FROM t ORDER BY c", &zResults));
  103.   assert(!strcmp("e\nf\ng\nh", zResults));
  104.   sqlite3_free(zResults);
  105.   zResults = NULL;
  106.  
  107.   // Maybe it's just in memory?
  108.   assert(SQLITE_OK == sqlite3_close(dst));
  109.   assert(SQLITE_OK == sqlite3_open(kDstFile, &dst));
  110.  
  111.   // Indeed, page size really did change.
  112.   assert(SQLITE_OK == sqlite3_execute_and_gather(dst, "PRAGMA page_size", &zResults));
  113.   assert(!strcmp("4096", zResults));
  114.   sqlite3_free(zResults);
  115.   zResults = NULL;
  116.  
  117.   // Make sure everything didn't succeed simply because assertions were turned
  118.   // off.
  119.   assert(!"Assertion succeeded!");
  120.   fprintf(stderr, "You don't have assertions on.\n");
  121.   return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment