Fossil SCM

Add the test-without-rowid command.

drh 2013-11-11 21:08 trunk
Commit 7ddfd42b60cad34560d4d889cd60dd5d2a7ad35b
1 file changed +66
+66
--- src/db.c
+++ src/db.c
@@ -2442,5 +2442,71 @@
24422442
rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]);
24432443
fossil_print("Time differences: %s\n", db_timespan_name(rDiff));
24442444
sqlite3_close(g.db);
24452445
g.db = 0;
24462446
}
2447
+
2448
+/*
2449
+** COMMAND: test-without-rowid
2450
+** %fossil test-without-rowid FILENAME...
2451
+**
2452
+** Change the Fossil repository FILENAME to make use of the WITHOUT ROWID
2453
+** optimization. FILENAME can also be the ~/.fossil file or a local
2454
+** .fslckout or _FOSSIL_ file.
2455
+**
2456
+** The purpose of this command is for testing the WITHOUT ROWID capabilities
2457
+** of SQLite. There is no big advantage to using WITHOUT ROWID in Fossil.
2458
+**
2459
+** Options:
2460
+** --dryrun | -n No changes. Just print what would happen.
2461
+*/
2462
+void test_without_rowid(void){
2463
+ int i, j;
2464
+ Stmt q;
2465
+ Blob allSql;
2466
+ int dryRun = find_option("dry-run", "n", 0)!=0;
2467
+ for(i=2; i<g.argc; i++){
2468
+ db_open_or_attach(g.argv[i], "main", 0);
2469
+ blob_init(&allSql, "BEGIN;\n", -1);
2470
+ db_prepare(&q,
2471
+ "SELECT name, sql FROM main.sqlite_master "
2472
+ " WHERE type='table' AND sql NOT LIKE '%%WITHOUT ROWID%%'"
2473
+ " AND name IN ('global_config','shun','concealed','config',"
2474
+ " 'plink','tagxref','backlink','vcache');"
2475
+ );
2476
+ while( db_step(&q)==SQLITE_ROW ){
2477
+ const char *zTName = db_column_text(&q, 0);
2478
+ const char *zOrigSql = db_column_text(&q, 1);
2479
+ Blob newSql;
2480
+ blob_init(&newSql, 0, 0);
2481
+ for(j=0; zOrigSql[j]; j++){
2482
+ if( fossil_strnicmp(zOrigSql+j,"unique",6)==0 ){
2483
+ blob_append(&newSql, zOrigSql, j);
2484
+ blob_append(&newSql, "PRIMARY KEY", -1);
2485
+ zOrigSql += j+6;
2486
+ j = -1;
2487
+ }
2488
+ }
2489
+ blob_append(&newSql, zOrigSql, -1);
2490
+ blob_appendf(&allSql,
2491
+ "ALTER TABLE %s RENAME TO x_%s;\n"
2492
+ "%s WITHOUT ROWID;\n"
2493
+ "INSERT INTO %s SELECT * FROM x_%s;\n"
2494
+ "DROP TABLE x_%s;\n",
2495
+ zTName, zTName, blob_str(&newSql), zTName, zTName, zTName
2496
+ );
2497
+ fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]);
2498
+ blob_reset(&newSql);
2499
+ }
2500
+ blob_appendf(&allSql, "COMMIT;\n");
2501
+ db_finalize(&q);
2502
+ if( dryRun ){
2503
+ fossil_print("SQL that would have been evaluated:\n");
2504
+ fossil_print("-------------------------------------------------------------\n");
2505
+ fossil_print("%s", blob_str(&allSql));
2506
+ }else{
2507
+ db_multi_exec("%s", blob_str(&allSql));
2508
+ }
2509
+ blob_reset(&allSql);
2510
+ db_close(1);
2511
+ }
2512
+}
24472513
--- src/db.c
+++ src/db.c
@@ -2442,5 +2442,71 @@
2442 rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]);
2443 fossil_print("Time differences: %s\n", db_timespan_name(rDiff));
2444 sqlite3_close(g.db);
2445 g.db = 0;
2446 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2447
--- src/db.c
+++ src/db.c
@@ -2442,5 +2442,71 @@
2442 rDiff = db_double(0.0, "SELECT julianday('now') - julianday(%Q)", g.argv[2]);
2443 fossil_print("Time differences: %s\n", db_timespan_name(rDiff));
2444 sqlite3_close(g.db);
2445 g.db = 0;
2446 }
2447
2448 /*
2449 ** COMMAND: test-without-rowid
2450 ** %fossil test-without-rowid FILENAME...
2451 **
2452 ** Change the Fossil repository FILENAME to make use of the WITHOUT ROWID
2453 ** optimization. FILENAME can also be the ~/.fossil file or a local
2454 ** .fslckout or _FOSSIL_ file.
2455 **
2456 ** The purpose of this command is for testing the WITHOUT ROWID capabilities
2457 ** of SQLite. There is no big advantage to using WITHOUT ROWID in Fossil.
2458 **
2459 ** Options:
2460 ** --dryrun | -n No changes. Just print what would happen.
2461 */
2462 void test_without_rowid(void){
2463 int i, j;
2464 Stmt q;
2465 Blob allSql;
2466 int dryRun = find_option("dry-run", "n", 0)!=0;
2467 for(i=2; i<g.argc; i++){
2468 db_open_or_attach(g.argv[i], "main", 0);
2469 blob_init(&allSql, "BEGIN;\n", -1);
2470 db_prepare(&q,
2471 "SELECT name, sql FROM main.sqlite_master "
2472 " WHERE type='table' AND sql NOT LIKE '%%WITHOUT ROWID%%'"
2473 " AND name IN ('global_config','shun','concealed','config',"
2474 " 'plink','tagxref','backlink','vcache');"
2475 );
2476 while( db_step(&q)==SQLITE_ROW ){
2477 const char *zTName = db_column_text(&q, 0);
2478 const char *zOrigSql = db_column_text(&q, 1);
2479 Blob newSql;
2480 blob_init(&newSql, 0, 0);
2481 for(j=0; zOrigSql[j]; j++){
2482 if( fossil_strnicmp(zOrigSql+j,"unique",6)==0 ){
2483 blob_append(&newSql, zOrigSql, j);
2484 blob_append(&newSql, "PRIMARY KEY", -1);
2485 zOrigSql += j+6;
2486 j = -1;
2487 }
2488 }
2489 blob_append(&newSql, zOrigSql, -1);
2490 blob_appendf(&allSql,
2491 "ALTER TABLE %s RENAME TO x_%s;\n"
2492 "%s WITHOUT ROWID;\n"
2493 "INSERT INTO %s SELECT * FROM x_%s;\n"
2494 "DROP TABLE x_%s;\n",
2495 zTName, zTName, blob_str(&newSql), zTName, zTName, zTName
2496 );
2497 fossil_print("Converting table %s of %s to WITHOUT ROWID.\n", zTName, g.argv[i]);
2498 blob_reset(&newSql);
2499 }
2500 blob_appendf(&allSql, "COMMIT;\n");
2501 db_finalize(&q);
2502 if( dryRun ){
2503 fossil_print("SQL that would have been evaluated:\n");
2504 fossil_print("-------------------------------------------------------------\n");
2505 fossil_print("%s", blob_str(&allSql));
2506 }else{
2507 db_multi_exec("%s", blob_str(&allSql));
2508 }
2509 blob_reset(&allSql);
2510 db_close(1);
2511 }
2512 }
2513

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button