OLD | NEW |
1 /* | 1 /* |
2 ** 2013-04-05 | 2 ** 2013-04-05 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 23 matching lines...) Expand all Loading... |
34 ** test script. | 34 ** test script. |
35 */ | 35 */ |
36 #include "sqlite3.h" | 36 #include "sqlite3.h" |
37 #include <stdio.h> | 37 #include <stdio.h> |
38 #if defined(_WIN32) | 38 #if defined(_WIN32) |
39 # define WIN32_LEAN_AND_MEAN | 39 # define WIN32_LEAN_AND_MEAN |
40 # include <windows.h> | 40 # include <windows.h> |
41 #else | 41 #else |
42 # include <unistd.h> | 42 # include <unistd.h> |
43 #endif | 43 #endif |
| 44 #include <errno.h> |
44 #include <stdlib.h> | 45 #include <stdlib.h> |
45 #include <string.h> | 46 #include <string.h> |
46 #include <assert.h> | 47 #include <assert.h> |
47 #include <ctype.h> | 48 #include <ctype.h> |
48 | 49 |
49 #define ISSPACE(X) isspace((unsigned char)(X)) | 50 #define ISSPACE(X) isspace((unsigned char)(X)) |
50 #define ISDIGIT(X) isdigit((unsigned char)(X)) | 51 #define ISDIGIT(X) isdigit((unsigned char)(X)) |
51 | 52 |
52 /* The suffix to append to the child command lines, if any */ | 53 /* The suffix to append to the child command lines, if any */ |
53 #if defined(_WIN32) | 54 #if defined(_WIN32) |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 } | 1238 } |
1238 | 1239 |
1239 /* Print a usage message for the program and exit */ | 1240 /* Print a usage message for the program and exit */ |
1240 static void usage(const char *argv0){ | 1241 static void usage(const char *argv0){ |
1241 int i; | 1242 int i; |
1242 const char *zTail = argv0; | 1243 const char *zTail = argv0; |
1243 for(i=0; argv0[i]; i++){ | 1244 for(i=0; argv0[i]; i++){ |
1244 if( isDirSep(argv0[i]) ) zTail = argv0+i+1; | 1245 if( isDirSep(argv0[i]) ) zTail = argv0+i+1; |
1245 } | 1246 } |
1246 fprintf(stderr,"Usage: %s DATABASE ?OPTIONS? ?SCRIPT?\n", zTail); | 1247 fprintf(stderr,"Usage: %s DATABASE ?OPTIONS? ?SCRIPT?\n", zTail); |
| 1248 fprintf(stderr, |
| 1249 "Options:\n" |
| 1250 " --errlog FILENAME Write errors to FILENAME\n" |
| 1251 " --journalmode MODE Use MODE as the journal_mode\n" |
| 1252 " --log FILENAME Log messages to FILENAME\n" |
| 1253 " --quiet Suppress unnecessary output\n" |
| 1254 " --vfs NAME Use NAME as the VFS\n" |
| 1255 " --repeat N Repeat the test N times\n" |
| 1256 " --sqltrace Enable SQL tracing\n" |
| 1257 " --sync Enable synchronous disk writes\n" |
| 1258 " --timeout MILLISEC Busy timeout is MILLISEC\n" |
| 1259 " --trace BOOLEAN Enable or disable tracing\n" |
| 1260 ); |
1247 exit(1); | 1261 exit(1); |
1248 } | 1262 } |
1249 | 1263 |
1250 /* Report on unrecognized arguments */ | 1264 /* Report on unrecognized arguments */ |
1251 static void unrecognizedArguments( | 1265 static void unrecognizedArguments( |
1252 const char *argv0, | 1266 const char *argv0, |
1253 int nArg, | 1267 int nArg, |
1254 char **azArg | 1268 char **azArg |
1255 ){ | 1269 ){ |
1256 int i; | 1270 int i; |
(...skipping 11 matching lines...) Expand all Loading... |
1268 int n, i; | 1282 int n, i; |
1269 int openFlags = SQLITE_OPEN_READWRITE; | 1283 int openFlags = SQLITE_OPEN_READWRITE; |
1270 int rc; | 1284 int rc; |
1271 char *zScript; | 1285 char *zScript; |
1272 int taskId; | 1286 int taskId; |
1273 const char *zTrace; | 1287 const char *zTrace; |
1274 const char *zCOption; | 1288 const char *zCOption; |
1275 const char *zJMode; | 1289 const char *zJMode; |
1276 const char *zNRep; | 1290 const char *zNRep; |
1277 int nRep = 1, iRep; | 1291 int nRep = 1, iRep; |
| 1292 int iTmout = 0; /* Default: no timeout */ |
| 1293 const char *zTmout; |
1278 | 1294 |
1279 g.argv0 = argv[0]; | 1295 g.argv0 = argv[0]; |
1280 g.iTrace = 1; | 1296 g.iTrace = 1; |
1281 if( argc<2 ) usage(argv[0]); | 1297 if( argc<2 ) usage(argv[0]); |
1282 g.zDbFile = argv[1]; | 1298 g.zDbFile = argv[1]; |
1283 if( strglob("*.test", g.zDbFile) ) usage(argv[0]); | 1299 if( strglob("*.test", g.zDbFile) ) usage(argv[0]); |
1284 if( strcmp(sqlite3_sourceid(), SQLITE_SOURCE_ID)!=0 ){ | 1300 if( strcmp(sqlite3_sourceid(), SQLITE_SOURCE_ID)!=0 ){ |
1285 fprintf(stderr, "SQLite library and header mismatch\n" | 1301 fprintf(stderr, "SQLite library and header mismatch\n" |
1286 "Library: %s\n" | 1302 "Library: %s\n" |
1287 "Header: %s\n", | 1303 "Header: %s\n", |
1288 sqlite3_sourceid(), SQLITE_SOURCE_ID); | 1304 sqlite3_sourceid(), SQLITE_SOURCE_ID); |
1289 exit(1); | 1305 exit(1); |
1290 } | 1306 } |
1291 n = argc-2; | 1307 n = argc-2; |
1292 sqlite3_snprintf(sizeof(g.zName), g.zName, "%05d.mptest", GETPID()); | 1308 sqlite3_snprintf(sizeof(g.zName), g.zName, "%05d.mptest", GETPID()); |
1293 zJMode = findOption(argv+2, &n, "journalmode", 1); | 1309 zJMode = findOption(argv+2, &n, "journalmode", 1); |
1294 zNRep = findOption(argv+2, &n, "repeat", 1); | 1310 zNRep = findOption(argv+2, &n, "repeat", 1); |
1295 if( zNRep ) nRep = atoi(zNRep); | 1311 if( zNRep ) nRep = atoi(zNRep); |
1296 if( nRep<1 ) nRep = 1; | 1312 if( nRep<1 ) nRep = 1; |
1297 g.zVfs = findOption(argv+2, &n, "vfs", 1); | 1313 g.zVfs = findOption(argv+2, &n, "vfs", 1); |
1298 zClient = findOption(argv+2, &n, "client", 1); | 1314 zClient = findOption(argv+2, &n, "client", 1); |
1299 g.zErrLog = findOption(argv+2, &n, "errlog", 1); | 1315 g.zErrLog = findOption(argv+2, &n, "errlog", 1); |
1300 g.zLog = findOption(argv+2, &n, "log", 1); | 1316 g.zLog = findOption(argv+2, &n, "log", 1); |
1301 zTrace = findOption(argv+2, &n, "trace", 1); | 1317 zTrace = findOption(argv+2, &n, "trace", 1); |
1302 if( zTrace ) g.iTrace = atoi(zTrace); | 1318 if( zTrace ) g.iTrace = atoi(zTrace); |
1303 if( findOption(argv+2, &n, "quiet", 0)!=0 ) g.iTrace = 0; | 1319 if( findOption(argv+2, &n, "quiet", 0)!=0 ) g.iTrace = 0; |
| 1320 zTmout = findOption(argv+2, &n, "timeout", 1); |
| 1321 if( zTmout ) iTmout = atoi(zTmout); |
1304 g.bSqlTrace = findOption(argv+2, &n, "sqltrace", 0)!=0; | 1322 g.bSqlTrace = findOption(argv+2, &n, "sqltrace", 0)!=0; |
1305 g.bSync = findOption(argv+2, &n, "sync", 0)!=0; | 1323 g.bSync = findOption(argv+2, &n, "sync", 0)!=0; |
1306 if( g.zErrLog ){ | 1324 if( g.zErrLog ){ |
1307 g.pErrLog = fopen(g.zErrLog, "a"); | 1325 g.pErrLog = fopen(g.zErrLog, "a"); |
1308 }else{ | 1326 }else{ |
1309 g.pErrLog = stderr; | 1327 g.pErrLog = stderr; |
1310 } | 1328 } |
1311 if( g.zLog ){ | 1329 if( g.zLog ){ |
1312 g.pLog = fopen(g.zLog, "a"); | 1330 g.pLog = fopen(g.zLog, "a"); |
1313 }else{ | 1331 }else{ |
1314 g.pLog = stdout; | 1332 g.pLog = stdout; |
1315 } | 1333 } |
1316 | 1334 |
1317 sqlite3_config(SQLITE_CONFIG_LOG, sqlErrorCallback, 0); | 1335 sqlite3_config(SQLITE_CONFIG_LOG, sqlErrorCallback, 0); |
1318 if( zClient ){ | 1336 if( zClient ){ |
1319 iClient = atoi(zClient); | 1337 iClient = atoi(zClient); |
1320 if( iClient<1 ) fatalError("illegal client number: %d\n", iClient); | 1338 if( iClient<1 ) fatalError("illegal client number: %d\n", iClient); |
1321 sqlite3_snprintf(sizeof(g.zName), g.zName, "%05d.client%02d", | 1339 sqlite3_snprintf(sizeof(g.zName), g.zName, "%05d.client%02d", |
1322 GETPID(), iClient); | 1340 GETPID(), iClient); |
1323 }else{ | 1341 }else{ |
| 1342 int nTry = 0; |
1324 if( g.iTrace>0 ){ | 1343 if( g.iTrace>0 ){ |
1325 printf("BEGIN: %s", argv[0]); | 1344 printf("BEGIN: %s", argv[0]); |
1326 for(i=1; i<argc; i++) printf(" %s", argv[i]); | 1345 for(i=1; i<argc; i++) printf(" %s", argv[i]); |
1327 printf("\n"); | 1346 printf("\n"); |
1328 printf("With SQLite " SQLITE_VERSION " " SQLITE_SOURCE_ID "\n" ); | 1347 printf("With SQLite " SQLITE_VERSION " " SQLITE_SOURCE_ID "\n" ); |
1329 for(i=0; (zCOption = sqlite3_compileoption_get(i))!=0; i++){ | 1348 for(i=0; (zCOption = sqlite3_compileoption_get(i))!=0; i++){ |
1330 printf("-DSQLITE_%s\n", zCOption); | 1349 printf("-DSQLITE_%s\n", zCOption); |
1331 } | 1350 } |
1332 fflush(stdout); | 1351 fflush(stdout); |
1333 } | 1352 } |
1334 iClient = 0; | 1353 iClient = 0; |
1335 unlink(g.zDbFile); | 1354 do{ |
| 1355 if( (nTry%5)==4 ) printf("... %strying to unlink '%s'\n", |
| 1356 nTry>5 ? "still " : "", g.zDbFile); |
| 1357 rc = unlink(g.zDbFile); |
| 1358 if( rc && errno==ENOENT ) rc = 0; |
| 1359 }while( rc!=0 && (++nTry)<60 && sqlite3_sleep(1000)>0 ); |
| 1360 if( rc!=0 ){ |
| 1361 fatalError("unable to unlink '%s' after %d attempts\n", |
| 1362 g.zDbFile, nTry); |
| 1363 } |
1336 openFlags |= SQLITE_OPEN_CREATE; | 1364 openFlags |= SQLITE_OPEN_CREATE; |
1337 } | 1365 } |
1338 rc = sqlite3_open_v2(g.zDbFile, &g.db, openFlags, g.zVfs); | 1366 rc = sqlite3_open_v2(g.zDbFile, &g.db, openFlags, g.zVfs); |
1339 if( rc ) fatalError("cannot open [%s]", g.zDbFile); | 1367 if( rc ) fatalError("cannot open [%s]", g.zDbFile); |
| 1368 if( iTmout>0 ) sqlite3_busy_timeout(g.db, iTmout); |
| 1369 |
1340 if( zJMode ){ | 1370 if( zJMode ){ |
1341 #if defined(_WIN32) | 1371 #if defined(_WIN32) |
1342 if( sqlite3_stricmp(zJMode,"persist")==0 | 1372 if( sqlite3_stricmp(zJMode,"persist")==0 |
1343 || sqlite3_stricmp(zJMode,"truncate")==0 | 1373 || sqlite3_stricmp(zJMode,"truncate")==0 |
1344 ){ | 1374 ){ |
1345 printf("Changing journal mode to DELETE from %s", zJMode); | 1375 printf("Changing journal mode to DELETE from %s", zJMode); |
1346 zJMode = "DELETE"; | 1376 zJMode = "DELETE"; |
1347 } | 1377 } |
1348 #endif | 1378 #endif |
1349 runSql("PRAGMA journal_mode=%Q;", zJMode); | 1379 runSql("PRAGMA journal_mode=%Q;", zJMode); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 maybeClose(g.pLog); | 1461 maybeClose(g.pLog); |
1432 maybeClose(g.pErrLog); | 1462 maybeClose(g.pErrLog); |
1433 if( iClient==0 ){ | 1463 if( iClient==0 ){ |
1434 printf("Summary: %d errors out of %d tests\n", g.nError, g.nTest); | 1464 printf("Summary: %d errors out of %d tests\n", g.nError, g.nTest); |
1435 printf("END: %s", argv[0]); | 1465 printf("END: %s", argv[0]); |
1436 for(i=1; i<argc; i++) printf(" %s", argv[i]); | 1466 for(i=1; i<argc; i++) printf(" %s", argv[i]); |
1437 printf("\n"); | 1467 printf("\n"); |
1438 } | 1468 } |
1439 return g.nError>0; | 1469 return g.nError>0; |
1440 } | 1470 } |
OLD | NEW |