1# 2014 August 30 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 13source [file join [file dirname [info script]] rbu_common.tcl] 14set ::testprefix rbumisc 15 16db close 17sqlite3_shutdown 18sqlite3_config_uri 1 19reset_db 20 21proc populate_rbu_db {} { 22 forcedelete rbu.db 23 sqlite3 rbu rbu.db 24 rbu eval { 25 CREATE TABLE data_x1(a, b, c, rbu_control); 26 INSERT INTO data_x1 VALUES(1, 1, 1, 0); 27 INSERT INTO data_x1 VALUES(2, 2, 2, 0); 28 29 CREATE TABLE dat(a, b, c, rbu_control); 30 CREATE TABLE "data x1"(a, b, c, rbu_control); 31 CREATE TABLE datax1(a, b, c, rbu_control); 32 CREATE TABLE data_(a, b, c, rbu_control); 33 34 INSERT INTO "data x1" VALUES(3, 3, 3, 0); 35 INSERT INTO datax1 VALUES(3, 3, 3, 0); 36 INSERT INTO data_ VALUES(3, 3, 3, 0); 37 INSERT INTO dat VALUES(3, 3, 3, 0); 38 } 39 rbu close 40} 41 42#------------------------------------------------------------------------- 43# Ensure that RBU is not confused by oddly named tables in an RBU 44# database. 45# 46do_execsql_test 1.0 { 47 CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); 48} 49do_test 1.1 { 50 populate_rbu_db 51} {} 52 53do_test 1.2 { 54 step_rbu test.db rbu.db 55 db eval { SELECT * FROM x1 } 56} {1 1 1 2 2 2} 57 58do_test 1.3 { 59 db eval { DELETE FROM x1 } 60 sqlite3 rbu rbu.db 61 rbu eval { DELETE FROM rbu_state } 62 rbu close 63 step_rbu test.db rbu.db 64 db eval { SELECT * FROM x1 } 65} {1 1 1 2 2 2} 66 67do_test 1.4 { 68 db eval { DELETE FROM x1 } 69 populate_rbu_db 70 71 sqlite3rbu rbu test.db rbu.db 72 rbu step 73 rbu step 74 rbu close 75 76 forcecopy test.db-oal test.db-wal 77 sqlite3rbu rbu test.db rbu.db 78 rbu step 79 list [catch { rbu close } msg] $msg 80} {1 {SQLITE_ERROR - cannot update wal mode database}} 81 82#------------------------------------------------------------------------- 83# Test the effect of a wal file appearing after the target database has 84# been opened, but before it has been locked. 85# 86catch { db close } 87testvfs tvfs -default 1 88 89for {set N 1} {$N < 10} {incr N} { 90 reset_db 91 populate_rbu_db 92 do_execsql_test 2.$N.0 { 93 CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); 94 } 95 96 set nAccessCnt 0 97 do_test 2.$N.1 { 98 sqlite3rbu rbu test.db rbu.db 99 rbu step 100 rbu step 101 rbu close 102 } {SQLITE_OK} 103 104 tvfs script xAccess 105 tvfs filter xAccess 106 set nAccessCnt 0 107 proc xAccess {method file args} { 108 global nAccessCnt 109 if {[file tail $file]=="test.db-wal"} { 110 incr nAccessCnt -1 111 if {$nAccessCnt==0} { 112 set fd [open test.db-wal w] 113 puts -nonewline $fd [string repeat 0 2000] 114 close $fd 115 } 116 } 117 return SQLITE_OK 118 } 119 120 foreach r { 121 {1 {SQLITE_ERROR - cannot update wal mode database}} 122 {0 SQLITE_OK} 123 {1 {SQLITE_CANTOPEN - unable to open database file}} 124 } { 125 set RES($r) 1 126 } 127 do_test 2.$N.2 { 128 set ::nAccessCnt $N 129 set res [list [catch { 130 sqlite3rbu rbu test.db rbu.db 131 rbu step 132 rbu close 133 } msg ] $msg] 134 set RES($res) 135 } {1} 136 catch {rbu close} 137} 138catch {db close} 139catch {tvfs delete} 140 141#------------------------------------------------------------------------- 142testvfs tvfs -default 1 143reset_db 144populate_rbu_db 145do_execsql_test 3.0 { 146 CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); 147} 148 149tvfs script xFileControl 150tvfs filter xFileControl 151 152proc xFileControl {method file verb args} { 153 if {$verb=="ZIPVFS" && [info exists ::zipvfs_filecontrol]} { 154 return $::zipvfs_filecontrol 155 } 156 return "SQLITE_NOTFOUND" 157} 158 159breakpoint 160foreach {tn ret err} { 161 1 SQLITE_OK 0 162 2 SQLITE_ERROR 1 163 3 SQLITE_NOTFOUND 0 164 4 SQLITE_OMIT 1 165} { 166 set ::zipvfs_filecontrol $ret 167 do_test 3.$tn.1 { 168 catch { 169 sqlite3rbu rbu test.db rbu.db 170 rbu step 171 rbu close 172 } 173 } $err 174} 175catch {db close} 176catch {tvfs delete} 177 178#------------------------------------------------------------------------- 179 180finish_test 181