File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / lock4.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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>