Index: third_party/sqlite/sqlite-src-3170000/ext/rbu/rbu.c |
diff --git a/third_party/sqlite/sqlite-src-3170000/ext/rbu/rbu.c b/third_party/sqlite/sqlite-src-3170000/ext/rbu/rbu.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a3efad0d44e5d30561df12dee565b6393fc7c233 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3170000/ext/rbu/rbu.c |
@@ -0,0 +1,148 @@ |
+/* |
+** 2014 August 30 |
+** |
+** The author disclaims copyright to this source code. In place of |
+** a legal notice, here is a blessing: |
+** |
+** May you do good and not evil. |
+** May you find forgiveness for yourself and forgive others. |
+** May you share freely, never taking more than you give. |
+** |
+************************************************************************* |
+** |
+** This file contains a command-line application that uses the RBU |
+** extension. See the usage() function below for an explanation. |
+*/ |
+ |
+#include "sqlite3rbu.h" |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <string.h> |
+ |
+/* |
+** Print a usage message and exit. |
+*/ |
+void usage(const char *zArgv0){ |
+ fprintf(stderr, |
+"Usage: %s ?OPTIONS? TARGET-DB RBU-DB\n" |
+"\n" |
+"Where options are:\n" |
+"\n" |
+" -step NSTEP\n" |
+" -vacuum\n" |
+"\n" |
+" If the -vacuum switch is not present, argument RBU-DB must be an RBU\n" |
+" database containing an update suitable for target database TARGET-DB.\n" |
+" Or, if -vacuum is specified, then TARGET-DB is a database to vacuum using\n" |
+" RBU, and RBU-DB is used as the state database for the vacuum (refer to\n" |
+" API documentation for details).\n" |
+"\n" |
+" If NSTEP is set to less than or equal to zero (the default value), this \n" |
+" program attempts to perform the entire update or vacuum operation before\n" |
+" exiting\n" |
+"\n" |
+" If NSTEP is greater than zero, then a maximum of NSTEP calls are made\n" |
+" to sqlite3rbu_step(). If the RBU update has not been completely applied\n" |
+" after the NSTEP'th call is made, the state is saved in the database RBU-DB\n" |
+" and the program exits. Subsequent invocations of this (or any other RBU)\n" |
+" application will use this state to resume applying the RBU update to the\n" |
+" target db.\n" |
+"\n" |
+, zArgv0); |
+ exit(1); |
+} |
+ |
+void report_default_vfs(){ |
+ sqlite3_vfs *pVfs = sqlite3_vfs_find(0); |
+ fprintf(stdout, "default vfs is \"%s\"\n", pVfs->zName); |
+} |
+ |
+void report_rbu_vfs(sqlite3rbu *pRbu){ |
+ sqlite3 *db = sqlite3rbu_db(pRbu, 0); |
+ if( db ){ |
+ char *zName = 0; |
+ sqlite3_file_control(db, "main", SQLITE_FCNTL_VFSNAME, &zName); |
+ if( zName ){ |
+ fprintf(stdout, "using vfs \"%s\"\n", zName); |
+ }else{ |
+ fprintf(stdout, "vfs name not available\n"); |
+ } |
+ sqlite3_free(zName); |
+ } |
+} |
+ |
+int main(int argc, char **argv){ |
+ int i; |
+ const char *zTarget; /* Target database to apply RBU to */ |
+ const char *zRbu; /* Database containing RBU */ |
+ char zBuf[200]; /* Buffer for printf() */ |
+ char *zErrmsg; /* Error message, if any */ |
+ sqlite3rbu *pRbu; /* RBU handle */ |
+ int nStep = 0; /* Maximum number of step() calls */ |
+ int bVacuum = 0; |
+ int rc; |
+ sqlite3_int64 nProgress = 0; |
+ int nArg = argc-2; |
+ |
+ if( argc<3 ) usage(argv[0]); |
+ for(i=1; i<nArg; i++){ |
+ const char *zArg = argv[i]; |
+ int nArg = strlen(zArg); |
+ if( nArg>1 && nArg<=8 && 0==memcmp(zArg, "-vacuum", nArg) ){ |
+ bVacuum = 1; |
+ }else if( nArg>1 && nArg<=5 && 0==memcmp(zArg, "-step", nArg) && i<nArg-1 ){ |
+ i++; |
+ nStep = atoi(argv[i]); |
+ }else{ |
+ usage(argv[0]); |
+ } |
+ } |
+ |
+ zTarget = argv[argc-2]; |
+ zRbu = argv[argc-1]; |
+ |
+ report_default_vfs(); |
+ |
+ /* Open an RBU handle. A vacuum handle if -vacuum was specified, or a |
+ ** regular RBU update handle otherwise. */ |
+ if( bVacuum ){ |
+ pRbu = sqlite3rbu_vacuum(zTarget, zRbu); |
+ }else{ |
+ pRbu = sqlite3rbu_open(zTarget, zRbu, 0); |
+ } |
+ report_rbu_vfs(pRbu); |
+ |
+ /* If nStep is less than or equal to zero, call |
+ ** sqlite3rbu_step() until either the RBU has been completely applied |
+ ** or an error occurs. Or, if nStep is greater than zero, call |
+ ** sqlite3rbu_step() a maximum of nStep times. */ |
+ for(i=0; (nStep<=0 || i<nStep) && sqlite3rbu_step(pRbu)==SQLITE_OK; i++); |
+ nProgress = sqlite3rbu_progress(pRbu); |
+ rc = sqlite3rbu_close(pRbu, &zErrmsg); |
+ |
+ /* Let the user know what happened. */ |
+ switch( rc ){ |
+ case SQLITE_OK: |
+ sqlite3_snprintf(sizeof(zBuf), zBuf, |
+ "SQLITE_OK: rbu update incomplete (%lld operations so far)\n", |
+ nProgress |
+ ); |
+ fprintf(stdout, "%s", zBuf); |
+ break; |
+ |
+ case SQLITE_DONE: |
+ sqlite3_snprintf(sizeof(zBuf), zBuf, |
+ "SQLITE_DONE: rbu update completed (%lld operations)\n", |
+ nProgress |
+ ); |
+ fprintf(stdout, "%s", zBuf); |
+ break; |
+ |
+ default: |
+ fprintf(stderr, "error=%d: %s\n", rc, zErrmsg); |
+ break; |
+ } |
+ |
+ sqlite3_free(zErrmsg); |
+ return (rc==SQLITE_OK || rc==SQLITE_DONE) ? 0 : 1; |
+} |