From: drh Date: Wed, 1 Nov 2017 00:10:34 +0000 (+0000) Subject: Begin putting functionality into the sqlite3_checker binary. X-Git-Tag: version-3.22.0~215^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4e8ad3bc1435e5202d1a59a9dd3e7eabfaff9469;p=thirdparty%2Fsqlite.git Begin putting functionality into the sqlite3_checker binary. FossilOrigin-Name: e82e883b93128e4d1105a82abe8d1860c0a15505b6ca421e187b9bbbc2fdc659 --- diff --git a/ext/repair/sqlite3_checker.tcl b/ext/repair/sqlite3_checker.tcl index 86799741bc..fa3ffd73ce 100644 --- a/ext/repair/sqlite3_checker.tcl +++ b/ext/repair/sqlite3_checker.tcl @@ -4,6 +4,21 @@ # program. # +# Special case: +# +# sqlite3_checker --test FILENAME ARGS +# +# uses FILENAME in place of this script. +# +if {[lindex $argv 0]=="--test" && [llength $argv]>2} { + set file [lindex $argv 1] + set argv [lrange $argv 2 end] + source $file + exit 0 +} + +# Emulate a TCL shell +# proc tclsh {} { set line {} while {![eof stdin]} { @@ -27,6 +42,8 @@ proc tclsh {} { } } +# Print a usage message on standard error, then quit. +# proc usage {} { set argv0 [file rootname [file tail [info nameofexecutable]]] puts stderr "Usage: $argv0 OPTIONS database-filename" @@ -36,6 +53,8 @@ Do sanity checking on a live SQLite3 database file specified by the Options: + --freelist Perform a freelist check + --tclsh Run the built-in TCL interpreter interactively (for debugging) --version Show the version number of SQLite @@ -45,6 +64,8 @@ Options: set file_to_analyze {} append argv {} +set bFreelistCheck 0 +set bSummary 1 foreach arg $argv { if {[regexp {^-+tclsh$} $arg]} { tclsh @@ -56,6 +77,11 @@ foreach arg $argv { mem close exit 0 } + if {[regexp {^-+freelist$} $arg]} { + set bFreelistCheck 1 + set bSummary 0 + continue + } if {[regexp {^-} $arg]} { puts stderr "Unknown option: $arg" usage @@ -86,3 +112,34 @@ if {![file readable $root_filename]} { puts stderr "File is not readable: $root_filename" exit 1 } + +if {[catch {sqlite3 db $file_to_analyze} res]} { + puts stderr "Cannot open datababase $root_filename: $res" + exit 1 +} + +if {$bFreelistCheck} { + puts "freelist-check:" + flush stdout + puts [db one {SELECT checkfreelist('main')}] +} +if {$bSummary} { + set scale 0 + set pgsz [db one {PRAGMA page_size}] + db eval {SELECT nPage*$pgsz AS sz, name, tbl_name + FROM sqlite_btreeinfo + WHERE type='index' + ORDER BY 1 DESC, name} { + if {$scale==0} { + if {$sz>10000000} { + set scale 1000000.0 + set unit MB + } else { + set scale 1000.0 + set unit KB + } + } + puts [format {%7.1f %s index %s of table %s} \ + [expr {$sz/$scale}] $unit $name $tbl_name] + } +} diff --git a/manifest b/manifest index 0976eed231..e4e6ce9964 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\srecent\senhancements\sfrom\strunk. -D 2017-10-31T18:15:36.138 +C Begin\sputting\sfunctionality\sinto\sthe\ssqlite3_checker\sbinary. +D 2017-11-01T00:10:34.144 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b @@ -330,7 +330,7 @@ F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b14469 F ext/repair/checkfreelist.c 0abb84b4545016d57ba1a2aa8884c72c73ed838968909858c03bc1f38fb6b054 F ext/repair/checkindex.c f33d90ed6a556ad03511f7932891c2fd47ad93ddc998a4ab8bb56f4adf6fb206 F ext/repair/sqlite3_checker.c.in 16d62615dfce1ff3eeac83d1a77fe376a7b660afa9db07e1fdd8b964dcc41510 -F ext/repair/sqlite3_checker.tcl 61437f3eb4de9ba044e0b72532dc13b7e0cf1a06e63c76198b1ef577cabe2de4 +F ext/repair/sqlite3_checker.tcl cc94d391dae61c5076cadd4789caa8a0cf19701a5f5cd19d329b77d2fe47a967 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/rtree.c cc91b6905bf55512c6ebc7dfdd37ac81c86f1753db8cfa6d62f0ee864464044f F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e @@ -1671,7 +1671,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0c22f0d6d19e595c0577b0bad416522e71647f54d2eb5cda587e2ccc5f63dd6a bb39744f4b2b25c10d293e85db7579e2a99c639fdab45e93d1de75952b68b2de -R 6d1ce2918085f767aa6a41a268922785 +P 24adf90ffb3ce9ff3c26efef0357f3a47312e8d11dc391ef2cc7e6873ef25895 +R f819f4cdc6b92e91586a5e2d567aa2dc U drh -Z 59d272efca4b8d35d600b1005fb03cf7 +Z e7d1ee3ba646c59ecaada1f36dfcbcb9 diff --git a/manifest.uuid b/manifest.uuid index 462cf20d71..f800dc1ed5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -24adf90ffb3ce9ff3c26efef0357f3a47312e8d11dc391ef2cc7e6873ef25895 \ No newline at end of file +e82e883b93128e4d1105a82abe8d1860c0a15505b6ca421e187b9bbbc2fdc659 \ No newline at end of file