1# 2015 Aug 8 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12 13if {![info exists testdir]} { 14 set testdir [file join [file dirname [info script]] .. .. test] 15} 16source $testdir/tester.tcl 17 18proc check_prestep_state {target state} { 19 set oal_exists [file exists $target-oal] 20 set wal_exists [file exists $target-wal] 21 set progress [rbu progress] 22 23 if {($progress==0 && $state!="oal" && $state!="done") 24 || ($oal_exists && $wal_exists) 25 || ($progress>0 && $state=="oal" && (!$oal_exists || $wal_exists)) 26 || ($state=="move" && (!$oal_exists || $wal_exists)) 27 || ($state=="checkpoint" && ($oal_exists || !$wal_exists)) 28 || ($state=="done" && ($oal_exists && $progress!=0)) 29 } { 30 error "B: state=$state progress=$progress oal=$oal_exists wal=$wal_exists" 31 } 32} 33 34proc check_poststep_state {rc target state} { 35 if {$rc=="SQLITE_OK" || $rc=="SQLITE_DONE"} { 36 set oal_exists [file exists $target-oal] 37 set wal_exists [file exists $target-wal] 38 if {$state=="move" && ($oal_exists || !$wal_exists)} { 39 error "A: state=$state progress=$progress oal=$oal_exists wal=$wal_exists" 40 } 41 } 42} 43 44# Run the RBU in file $rbu on target database $target until completion. 45# 46proc run_rbu {target rbu} { 47 sqlite3rbu rbu $target $rbu 48 while 1 { 49 set state [rbu state] 50 51 check_prestep_state $target $state 52 set rc [rbu step] 53 check_poststep_state $rc $target $state 54 55 if {$rc!="SQLITE_OK"} break 56 } 57 rbu close 58} 59 60proc step_rbu {target rbu} { 61 while 1 { 62 sqlite3rbu rbu $target $rbu 63 set state [rbu state] 64 check_prestep_state $target $state 65 set rc [rbu step] 66 check_poststep_state $rc $target $state 67 rbu close 68 if {$rc != "SQLITE_OK"} break 69 } 70 set rc 71} 72 73proc do_rbu_vacuum_test {tn step} { 74 uplevel [list do_test $tn.1 { 75 if {$step==0} { sqlite3rbu_vacuum rbu test.db state.db } 76 while 1 { 77 if {$step==1} { sqlite3rbu_vacuum rbu test.db state.db } 78 set state [rbu state] 79 check_prestep_state test.db $state 80 set rc [rbu step] 81 check_poststep_state $rc test.db $state 82 if {$rc!="SQLITE_OK"} break 83 if {$step==1} { rbu close } 84 } 85 rbu close 86 } {SQLITE_DONE}] 87 88 uplevel [list do_execsql_test $tn.2 { 89 PRAGMA integrity_check 90 } ok] 91} 92 93