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.1.1.1 2012/02/21 17:04:16 misho 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>