Fossil SCM
Improvements to the ".fullschema" command in the command-line shell.
Commit
13f8ba6ca89c8ae3398062162ad19e71f5d28571
Parent
2b79c600d545e8c…
1 file changed
+28
-15
+28
-15
| --- src/shell.c | ||
| +++ src/shell.c | ||
| @@ -2414,10 +2414,11 @@ | ||
| 2414 | 2414 | }else |
| 2415 | 2415 | |
| 2416 | 2416 | if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ |
| 2417 | 2417 | struct callback_data data; |
| 2418 | 2418 | char *zErrMsg = 0; |
| 2419 | + int doStats = 0; | |
| 2419 | 2420 | if( nArg!=1 ){ |
| 2420 | 2421 | fprintf(stderr, "Usage: .fullschema\n"); |
| 2421 | 2422 | rc = 1; |
| 2422 | 2423 | goto meta_command_exit; |
| 2423 | 2424 | } |
| @@ -2432,25 +2433,37 @@ | ||
| 2432 | 2433 | " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " |
| 2433 | 2434 | "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" |
| 2434 | 2435 | "ORDER BY rowid", |
| 2435 | 2436 | callback, &data, &zErrMsg |
| 2436 | 2437 | ); |
| 2437 | - sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master;'", | |
| 2438 | - callback, &data, &zErrMsg); | |
| 2439 | - data.mode = MODE_Insert; | |
| 2440 | - data.zDestTable = "sqlite_stat1"; | |
| 2441 | - shell_exec(p->db, "SELECT * FROM sqlite_stat1", | |
| 2442 | - shell_callback, &data,&zErrMsg); | |
| 2443 | - data.zDestTable = "sqlite_stat3"; | |
| 2444 | - shell_exec(p->db, "SELECT * FROM sqlite_stat3", | |
| 2445 | - shell_callback, &data,&zErrMsg); | |
| 2446 | - data.zDestTable = "sqlite_stat4"; | |
| 2447 | - shell_exec(p->db, "SELECT * FROM sqlite_stat4", | |
| 2448 | - shell_callback, &data, &zErrMsg); | |
| 2449 | - data.mode = MODE_Semi; | |
| 2450 | - shell_exec(p->db, "SELECT 'ANALYZE sqlite_master;'", | |
| 2451 | - shell_callback, &data, &zErrMsg); | |
| 2438 | + if( rc==SQLITE_OK ){ | |
| 2439 | + sqlite3_stmt *pStmt; | |
| 2440 | + rc = sqlite3_prepare_v2(p->db, | |
| 2441 | + "SELECT rowid FROM sqlite_master" | |
| 2442 | + " WHERE name GLOB 'sqlite_stat[134]'", | |
| 2443 | + -1, &pStmt, 0); | |
| 2444 | + doStats = sqlite3_step(pStmt)==SQLITE_ROW; | |
| 2445 | + sqlite3_finalize(pStmt); | |
| 2446 | + } | |
| 2447 | + if( doStats==0 ){ | |
| 2448 | + fprintf(p->out, "/* No STAT tables available */\n"); | |
| 2449 | + }else{ | |
| 2450 | + fprintf(p->out, "ANALYZE sqlite_master;\n"); | |
| 2451 | + sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'", | |
| 2452 | + callback, &data, &zErrMsg); | |
| 2453 | + data.mode = MODE_Insert; | |
| 2454 | + data.zDestTable = "sqlite_stat1"; | |
| 2455 | + shell_exec(p->db, "SELECT * FROM sqlite_stat1", | |
| 2456 | + shell_callback, &data,&zErrMsg); | |
| 2457 | + data.zDestTable = "sqlite_stat3"; | |
| 2458 | + shell_exec(p->db, "SELECT * FROM sqlite_stat3", | |
| 2459 | + shell_callback, &data,&zErrMsg); | |
| 2460 | + data.zDestTable = "sqlite_stat4"; | |
| 2461 | + shell_exec(p->db, "SELECT * FROM sqlite_stat4", | |
| 2462 | + shell_callback, &data, &zErrMsg); | |
| 2463 | + fprintf(p->out, "ANALYZE sqlite_master;\n"); | |
| 2464 | + } | |
| 2452 | 2465 | }else |
| 2453 | 2466 | |
| 2454 | 2467 | if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ |
| 2455 | 2468 | if( nArg==2 ){ |
| 2456 | 2469 | p->showHeader = booleanValue(azArg[1]); |
| 2457 | 2470 |
| --- src/shell.c | |
| +++ src/shell.c | |
| @@ -2414,10 +2414,11 @@ | |
| 2414 | }else |
| 2415 | |
| 2416 | if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ |
| 2417 | struct callback_data data; |
| 2418 | char *zErrMsg = 0; |
| 2419 | if( nArg!=1 ){ |
| 2420 | fprintf(stderr, "Usage: .fullschema\n"); |
| 2421 | rc = 1; |
| 2422 | goto meta_command_exit; |
| 2423 | } |
| @@ -2432,25 +2433,37 @@ | |
| 2432 | " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " |
| 2433 | "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" |
| 2434 | "ORDER BY rowid", |
| 2435 | callback, &data, &zErrMsg |
| 2436 | ); |
| 2437 | sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master;'", |
| 2438 | callback, &data, &zErrMsg); |
| 2439 | data.mode = MODE_Insert; |
| 2440 | data.zDestTable = "sqlite_stat1"; |
| 2441 | shell_exec(p->db, "SELECT * FROM sqlite_stat1", |
| 2442 | shell_callback, &data,&zErrMsg); |
| 2443 | data.zDestTable = "sqlite_stat3"; |
| 2444 | shell_exec(p->db, "SELECT * FROM sqlite_stat3", |
| 2445 | shell_callback, &data,&zErrMsg); |
| 2446 | data.zDestTable = "sqlite_stat4"; |
| 2447 | shell_exec(p->db, "SELECT * FROM sqlite_stat4", |
| 2448 | shell_callback, &data, &zErrMsg); |
| 2449 | data.mode = MODE_Semi; |
| 2450 | shell_exec(p->db, "SELECT 'ANALYZE sqlite_master;'", |
| 2451 | shell_callback, &data, &zErrMsg); |
| 2452 | }else |
| 2453 | |
| 2454 | if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ |
| 2455 | if( nArg==2 ){ |
| 2456 | p->showHeader = booleanValue(azArg[1]); |
| 2457 |
| --- src/shell.c | |
| +++ src/shell.c | |
| @@ -2414,10 +2414,11 @@ | |
| 2414 | }else |
| 2415 | |
| 2416 | if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ |
| 2417 | struct callback_data data; |
| 2418 | char *zErrMsg = 0; |
| 2419 | int doStats = 0; |
| 2420 | if( nArg!=1 ){ |
| 2421 | fprintf(stderr, "Usage: .fullschema\n"); |
| 2422 | rc = 1; |
| 2423 | goto meta_command_exit; |
| 2424 | } |
| @@ -2432,25 +2433,37 @@ | |
| 2433 | " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " |
| 2434 | "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" |
| 2435 | "ORDER BY rowid", |
| 2436 | callback, &data, &zErrMsg |
| 2437 | ); |
| 2438 | if( rc==SQLITE_OK ){ |
| 2439 | sqlite3_stmt *pStmt; |
| 2440 | rc = sqlite3_prepare_v2(p->db, |
| 2441 | "SELECT rowid FROM sqlite_master" |
| 2442 | " WHERE name GLOB 'sqlite_stat[134]'", |
| 2443 | -1, &pStmt, 0); |
| 2444 | doStats = sqlite3_step(pStmt)==SQLITE_ROW; |
| 2445 | sqlite3_finalize(pStmt); |
| 2446 | } |
| 2447 | if( doStats==0 ){ |
| 2448 | fprintf(p->out, "/* No STAT tables available */\n"); |
| 2449 | }else{ |
| 2450 | fprintf(p->out, "ANALYZE sqlite_master;\n"); |
| 2451 | sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'", |
| 2452 | callback, &data, &zErrMsg); |
| 2453 | data.mode = MODE_Insert; |
| 2454 | data.zDestTable = "sqlite_stat1"; |
| 2455 | shell_exec(p->db, "SELECT * FROM sqlite_stat1", |
| 2456 | shell_callback, &data,&zErrMsg); |
| 2457 | data.zDestTable = "sqlite_stat3"; |
| 2458 | shell_exec(p->db, "SELECT * FROM sqlite_stat3", |
| 2459 | shell_callback, &data,&zErrMsg); |
| 2460 | data.zDestTable = "sqlite_stat4"; |
| 2461 | shell_exec(p->db, "SELECT * FROM sqlite_stat4", |
| 2462 | shell_callback, &data, &zErrMsg); |
| 2463 | fprintf(p->out, "ANALYZE sqlite_master;\n"); |
| 2464 | } |
| 2465 | }else |
| 2466 | |
| 2467 | if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ |
| 2468 | if( nArg==2 ){ |
| 2469 | p->showHeader = booleanValue(azArg[1]); |
| 2470 |