Index: third_party/sqlite/src/mptest/mptest.c |
diff --git a/third_party/sqlite/src/mptest/mptest.c b/third_party/sqlite/src/mptest/mptest.c |
index b29ebdc9e110fff92ca6bd4e3cea590318934977..5022b009e6bf7772a1d6eba7189f2fde67e988e3 100644 |
--- a/third_party/sqlite/src/mptest/mptest.c |
+++ b/third_party/sqlite/src/mptest/mptest.c |
@@ -41,6 +41,7 @@ |
#else |
# include <unistd.h> |
#endif |
+#include <errno.h> |
#include <stdlib.h> |
#include <string.h> |
#include <assert.h> |
@@ -1244,6 +1245,19 @@ static void usage(const char *argv0){ |
if( isDirSep(argv0[i]) ) zTail = argv0+i+1; |
} |
fprintf(stderr,"Usage: %s DATABASE ?OPTIONS? ?SCRIPT?\n", zTail); |
+ fprintf(stderr, |
+ "Options:\n" |
+ " --errlog FILENAME Write errors to FILENAME\n" |
+ " --journalmode MODE Use MODE as the journal_mode\n" |
+ " --log FILENAME Log messages to FILENAME\n" |
+ " --quiet Suppress unnecessary output\n" |
+ " --vfs NAME Use NAME as the VFS\n" |
+ " --repeat N Repeat the test N times\n" |
+ " --sqltrace Enable SQL tracing\n" |
+ " --sync Enable synchronous disk writes\n" |
+ " --timeout MILLISEC Busy timeout is MILLISEC\n" |
+ " --trace BOOLEAN Enable or disable tracing\n" |
+ ); |
exit(1); |
} |
@@ -1275,6 +1289,8 @@ int SQLITE_CDECL main(int argc, char **argv){ |
const char *zJMode; |
const char *zNRep; |
int nRep = 1, iRep; |
+ int iTmout = 0; /* Default: no timeout */ |
+ const char *zTmout; |
g.argv0 = argv[0]; |
g.iTrace = 1; |
@@ -1301,6 +1317,8 @@ int SQLITE_CDECL main(int argc, char **argv){ |
zTrace = findOption(argv+2, &n, "trace", 1); |
if( zTrace ) g.iTrace = atoi(zTrace); |
if( findOption(argv+2, &n, "quiet", 0)!=0 ) g.iTrace = 0; |
+ zTmout = findOption(argv+2, &n, "timeout", 1); |
+ if( zTmout ) iTmout = atoi(zTmout); |
g.bSqlTrace = findOption(argv+2, &n, "sqltrace", 0)!=0; |
g.bSync = findOption(argv+2, &n, "sync", 0)!=0; |
if( g.zErrLog ){ |
@@ -1321,6 +1339,7 @@ int SQLITE_CDECL main(int argc, char **argv){ |
sqlite3_snprintf(sizeof(g.zName), g.zName, "%05d.client%02d", |
GETPID(), iClient); |
}else{ |
+ int nTry = 0; |
if( g.iTrace>0 ){ |
printf("BEGIN: %s", argv[0]); |
for(i=1; i<argc; i++) printf(" %s", argv[i]); |
@@ -1332,11 +1351,22 @@ int SQLITE_CDECL main(int argc, char **argv){ |
fflush(stdout); |
} |
iClient = 0; |
- unlink(g.zDbFile); |
+ do{ |
+ if( (nTry%5)==4 ) printf("... %strying to unlink '%s'\n", |
+ nTry>5 ? "still " : "", g.zDbFile); |
+ rc = unlink(g.zDbFile); |
+ if( rc && errno==ENOENT ) rc = 0; |
+ }while( rc!=0 && (++nTry)<60 && sqlite3_sleep(1000)>0 ); |
+ if( rc!=0 ){ |
+ fatalError("unable to unlink '%s' after %d attempts\n", |
+ g.zDbFile, nTry); |
+ } |
openFlags |= SQLITE_OPEN_CREATE; |
} |
rc = sqlite3_open_v2(g.zDbFile, &g.db, openFlags, g.zVfs); |
if( rc ) fatalError("cannot open [%s]", g.zDbFile); |
+ if( iTmout>0 ) sqlite3_busy_timeout(g.db, iTmout); |
+ |
if( zJMode ){ |
#if defined(_WIN32) |
if( sqlite3_stricmp(zJMode,"persist")==0 |