| # | |
| # 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. | |
| # | |
| #*********************************************************************** | |
| # | |
| # $Id: async2.test,v 1.12 2009/04/25 08:39:15 danielk1977 Exp $ | |
| set testdir [file dirname $argv0] | |
| source $testdir/tester.tcl | |
| if { | |
| [info commands sqlite3async_initialize]=="" || | |
| [info command sqlite3_memdebug_fail]=="" | |
| } { | |
| # The async logic is not built into this system | |
| puts "Skipping async2 tests: not compiled with required features" | |
| finish_test | |
| return | |
| } | |
| # Enable asynchronous IO. | |
| set setup_script { | |
| CREATE TABLE counter(c); | |
| INSERT INTO counter(c) VALUES (1); | |
| } | |
| set sql_script { | |
| BEGIN; | |
| UPDATE counter SET c = 2; | |
| CREATE TABLE t1(a PRIMARY KEY, b, c); | |
| CREATE TABLE t2(a PRIMARY KEY, b, c); | |
| COMMIT; | |
| BEGIN; | |
| UPDATE counter SET c = 3; | |
| INSERT INTO t1 VALUES('abcdefghij', 'four', 'score'); | |
| INSERT INTO t2 VALUES('klmnopqrst', 'and', 'seven'); | |
| COMMIT; | |
| UPDATE counter SET c = 'FIN'; | |
| } | |
| db close | |
| foreach err [list ioerr malloc-transient malloc-persistent] { | |
| set ::go 10 | |
| for {set n 1} {$::go} {incr n} { | |
| set ::sqlite_io_error_pending 0 | |
| sqlite3_memdebug_fail -1 | |
| forcedelete test.db test.db-journal | |
| sqlite3 db test.db | |
| execsql $::setup_script | |
| db close | |
| sqlite3async_initialize "" 1 | |
| sqlite3 db test.db | |
| sqlite3_db_config_lookaside db 0 0 0 | |
| switch -- $err { | |
| ioerr { set ::sqlite_io_error_pending $n } | |
| malloc-persistent { sqlite3_memdebug_fail $n -repeat 1 } | |
| malloc-transient { sqlite3_memdebug_fail $n -repeat 0 } | |
| } | |
| catchsql $::sql_script | |
| db close | |
| sqlite3async_control halt idle | |
| sqlite3async_start | |
| sqlite3async_wait | |
| sqlite3async_control halt never | |
| sqlite3async_shutdown | |
| set ::sqlite_io_error_pending 0 | |
| sqlite3_memdebug_fail -1 | |
| sqlite3 db test.db | |
| set c [db one {SELECT c FROM counter LIMIT 1}] | |
| switch -- $c { | |
| 1 { | |
| do_test async-$err-1.1.$n { | |
| execsql { | |
| SELECT name FROM sqlite_master; | |
| } | |
| } {counter} | |
| } | |
| 2 { | |
| do_test async-$err-1.2.$n.1 { | |
| execsql { | |
| SELECT * FROM t1; | |
| } | |
| } {} | |
| do_test async-$err-1.2.$n.2 { | |
| execsql { | |
| SELECT * FROM t2; | |
| } | |
| } {} | |
| } | |
| 3 { | |
| do_test async-$err-1.3.$n.1 { | |
| execsql { | |
| SELECT * FROM t1; | |
| } | |
| } {abcdefghij four score} | |
| do_test async-$err-1.3.$n.2 { | |
| execsql { | |
| SELECT * FROM t2; | |
| } | |
| } {klmnopqrst and seven} | |
| } | |
| FIN { | |
| incr ::go -1 | |
| } | |
| } | |
| db close | |
| } | |
| } | |
| catch {db close} | |
| finish_test |