Annotation of embedaddon/sqlite3/test/lock4.test, revision 1.1
1.1 ! misho 1: # 2007 April 6
! 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: # This file implements regression tests for SQLite library. The
! 12: # focus of this script is database locks.
! 13: #
! 14: # $Id: lock4.test,v 1.10 2009/05/06 00:52:41 drh Exp $
! 15:
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: do_not_use_codec
! 21:
! 22: # Initialize the test.db database so that it is non-empty
! 23: #
! 24: do_test lock4-1.1 {
! 25: db eval {
! 26: PRAGMA auto_vacuum=OFF;
! 27: CREATE TABLE t1(x);
! 28: }
! 29: forcedelete test2.db test2.db-journal
! 30: sqlite3 db2 test2.db
! 31: db2 eval {
! 32: PRAGMA auto_vacuum=OFF;
! 33: CREATE TABLE t2(x)
! 34: }
! 35: db2 close
! 36: list [file size test.db] [file size test2.db]
! 37: } {2048 2048}
! 38:
! 39: # Create a script to drive a separate process that will
! 40: #
! 41: # 1. Create a second database test2.db
! 42: # 2. Get an exclusive lock on test2.db
! 43: # 3. Add an entry to test.db in table t1, waiting as necessary.
! 44: # 4. Commit the change to test2.db.
! 45: #
! 46: # Meanwhile, this process will:
! 47: #
! 48: # A. Get an exclusive lock on test.db
! 49: # B. Attempt to read from test2.db but get an SQLITE_BUSY error.
! 50: # C. Commit the changes to test.db thus alloing the other process
! 51: # to continue.
! 52: #
! 53: do_test lock4-1.2 {
! 54:
! 55: # Create a script for the second process to run.
! 56: #
! 57: set out [open test2-script.tcl w]
! 58: puts $out "sqlite3_test_control_pending_byte [set sqlite_pending_byte]"
! 59: puts $out {
! 60: sqlite3 db2 test2.db
! 61: db2 eval {
! 62: BEGIN;
! 63: INSERT INTO t2 VALUES(2);
! 64: }
! 65: sqlite3 db test.db
! 66: db timeout 1000000
! 67: db eval {
! 68: INSERT INTO t1 VALUES(2);
! 69: }
! 70: db close
! 71: db2 eval COMMIT
! 72: exit
! 73: }
! 74: close $out
! 75:
! 76: # Begin a transaction on test.db.
! 77: db eval {
! 78: BEGIN EXCLUSIVE;
! 79: INSERT INTO t1 VALUES(1);
! 80: }
! 81:
! 82: # Kick off the second process.
! 83: exec [info nameofexec] ./test2-script.tcl &
! 84:
! 85: # Wait until the second process has started its transaction on test2.db.
! 86: while {![file exists test2.db-journal]} {
! 87: after 10
! 88: }
! 89:
! 90: # Try to write to test2.db. We are locked out.
! 91: sqlite3 db2 test2.db
! 92: catchsql {
! 93: INSERT INTO t2 VALUES(1)
! 94: } db2
! 95: } {1 {database is locked}}
! 96: do_test lock4-1.3 {
! 97: db eval {
! 98: COMMIT;
! 99: }
! 100: while {[file exists test2.db-journal]} {
! 101: after 10
! 102: }
! 103: # The other process has committed its transaction on test2.db by
! 104: # deleting the journal file. But it might retain the lock for a
! 105: # fraction longer
! 106: #
! 107: after 25
! 108: db2 eval {
! 109: SELECT * FROM t2
! 110: }
! 111: } {2}
! 112:
! 113:
! 114: do_test lock4-999.1 {
! 115: rename db2 {}
! 116: } {}
! 117:
! 118: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>