diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/lock4.test --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/lock4.test Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,115 @@ +# 2007 April 6 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this script is database locks. +# +# $Id: lock4.test,v 1.8 2008/03/14 08:57:42 danielk1977 Exp $ + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# Initialize the test.db database so that it is non-empty +# +do_test lock4-1.1 { + db eval { + PRAGMA auto_vacuum=OFF; + CREATE TABLE t1(x); + } + file delete -force test2.db test2.db-journal + sqlite3 db2 test2.db + db2 eval { + PRAGMA auto_vacuum=OFF; + CREATE TABLE t2(x) + } + db2 close + list [file size test.db] [file size test2.db] +} {2048 2048} + +# Create a script to drive a separate process that will +# +# 1. Create a second database test2.db +# 2. Get an exclusive lock on test2.db +# 3. Add an entry to test.db in table t1, waiting as necessary. +# 4. Commit the change to test2.db. +# +# Meanwhile, this process will: +# +# A. Get an exclusive lock on test.db +# B. Attempt to read from test2.db but get an SQLITE_BUSY error. +# C. Commit the changes to test.db thus alloing the other process +# to continue. +# +do_test lock4-1.2 { + + # Create a script for the second process to run. + # + set out [open test2-script.tcl w] + puts $out "set sqlite_pending_byte [set sqlite_pending_byte]" + puts $out { + sqlite3 db2 test2.db + db2 eval { + BEGIN; + INSERT INTO t2 VALUES(2); + } + sqlite3 db test.db + db timeout 1000000 + db eval { + INSERT INTO t1 VALUES(2); + } + db close + db2 eval COMMIT + exit + } + close $out + + # Begin a transaction on test.db. + db eval { + BEGIN EXCLUSIVE; + INSERT INTO t1 VALUES(1); + } + + # Kick off the second process. + exec [info nameofexec] ./test2-script.tcl & + + # Wait until the second process has started its transaction on test2.db. + while {![file exists test2.db-journal]} { + after 10 + } + + # Try to write to test2.db. We are locked out. + sqlite3 db2 test2.db + catchsql { + INSERT INTO t2 VALUES(1) + } db2 +} {1 {database is locked}} +do_test lock4-1.3 { + db eval { + COMMIT; + } + while {[file exists test2.db-journal]} { + after 10 + } + # The other process has committed its transaction on test2.db by + # deleting the journal file. But it might retain the lock for a + # fraction longer + # + db2 eval { + SELECT * FROM t2 + } +} {2} + + +do_test lock4-999.1 { + rename db2 {} +} {} + +finish_test