| # 2014 August 30 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # |
| |
| source [file join [file dirname [info script]] rbu_common.tcl] |
| if_no_rbu_support { finish_test ; return } |
| set ::testprefix rbumisc |
| |
| proc populate_rbu_db {} { |
| forcedelete rbu.db |
| sqlite3 rbu rbu.db |
| rbu eval { |
| CREATE TABLE data_x1(a, b, c, rbu_control); |
| INSERT INTO data_x1 VALUES(1, 1, 1, 0); |
| INSERT INTO data_x1 VALUES(2, 2, 2, 0); |
| |
| CREATE TABLE dat(a, b, c, rbu_control); |
| CREATE TABLE "data x1"(a, b, c, rbu_control); |
| CREATE TABLE datax1(a, b, c, rbu_control); |
| CREATE TABLE data_(a, b, c, rbu_control); |
| |
| INSERT INTO "data x1" VALUES(3, 3, 3, 0); |
| INSERT INTO datax1 VALUES(3, 3, 3, 0); |
| INSERT INTO data_ VALUES(3, 3, 3, 0); |
| INSERT INTO dat VALUES(3, 3, 3, 0); |
| } |
| rbu close |
| } |
| |
| #------------------------------------------------------------------------- |
| # Ensure that RBU is not confused by oddly named tables in an RBU |
| # database. |
| # |
| do_execsql_test 1.0 { |
| CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); |
| } |
| do_test 1.1 { |
| populate_rbu_db |
| } {} |
| |
| do_test 1.2 { |
| step_rbu test.db rbu.db |
| db eval { SELECT * FROM x1 } |
| } {1 1 1 2 2 2} |
| |
| do_test 1.3 { |
| db eval { DELETE FROM x1 } |
| sqlite3 rbu rbu.db |
| rbu eval { DELETE FROM rbu_state } |
| rbu close |
| step_rbu test.db rbu.db |
| db eval { SELECT * FROM x1 } |
| } {1 1 1 2 2 2} |
| |
| do_test 1.4 { |
| db eval { DELETE FROM x1 } |
| populate_rbu_db |
| |
| sqlite3rbu rbu test.db rbu.db |
| rbu step |
| rbu step |
| rbu close |
| |
| forcecopy test.db-oal test.db-wal |
| sqlite3rbu rbu test.db rbu.db |
| rbu step |
| list [catch { rbu close } msg] $msg |
| } {1 {SQLITE_ERROR - cannot update wal mode database}} |
| |
| #------------------------------------------------------------------------- |
| # Test the effect of a wal file appearing after the target database has |
| # been opened, but before it has been locked. |
| # |
| catch { db close } |
| testvfs tvfs -default 1 |
| |
| for {set N 1} {$N < 10} {incr N} { |
| reset_db |
| populate_rbu_db |
| do_execsql_test 2.$N.0 { |
| CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); |
| } |
| |
| set nAccessCnt 0 |
| do_test 2.$N.1 { |
| sqlite3rbu rbu test.db rbu.db |
| rbu step |
| rbu step |
| rbu close |
| } {SQLITE_OK} |
| |
| tvfs script xAccess |
| tvfs filter xAccess |
| set nAccessCnt 0 |
| proc xAccess {method file args} { |
| global nAccessCnt |
| if {[file tail $file]=="test.db-wal"} { |
| incr nAccessCnt -1 |
| if {$nAccessCnt==0} { |
| set fd [open test.db-wal w] |
| puts -nonewline $fd [string repeat 0 2000] |
| close $fd |
| } |
| } |
| return SQLITE_OK |
| } |
| |
| foreach r { |
| {1 {SQLITE_ERROR - cannot update wal mode database}} |
| {0 SQLITE_OK} |
| {1 {SQLITE_CANTOPEN - unable to open database file}} |
| } { |
| set RES($r) 1 |
| } |
| do_test 2.$N.2 { |
| set ::nAccessCnt $N |
| set res [list [catch { |
| sqlite3rbu rbu test.db rbu.db |
| rbu step |
| rbu close |
| } msg ] $msg] |
| set RES($res) |
| } {1} |
| catch {rbu close} |
| } |
| catch {db close} |
| catch {tvfs delete} |
| |
| #------------------------------------------------------------------------- |
| testvfs tvfs -default 1 |
| reset_db |
| populate_rbu_db |
| do_execsql_test 3.0 { |
| CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY); |
| } |
| |
| tvfs script xFileControl |
| tvfs filter xFileControl |
| |
| proc xFileControl {method file verb args} { |
| if {$verb=="ZIPVFS" && [info exists ::zipvfs_filecontrol]} { |
| return $::zipvfs_filecontrol |
| } |
| return "SQLITE_NOTFOUND" |
| } |
| |
| breakpoint |
| foreach {tn ret err} { |
| 1 SQLITE_OK 0 |
| 2 SQLITE_ERROR 1 |
| 3 SQLITE_NOTFOUND 0 |
| 4 SQLITE_OMIT 1 |
| } { |
| set ::zipvfs_filecontrol $ret |
| do_test 3.$tn.1 { |
| catch { |
| sqlite3rbu rbu test.db rbu.db |
| rbu step |
| rbu close |
| } |
| } $err |
| } |
| catch {db close} |
| catch {tvfs delete} |
| |
| #------------------------------------------------------------------------- |
| |
| finish_test |