gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/unixexcl.test (about)

     1  # 2011 March 30
     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  #
    12  # This file contains tests for the "unix-excl" VFS module (part of 
    13  # os_unix.c).
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  source $testdir/lock_common.tcl
    19  source $testdir/malloc_common.tcl
    20  
    21  if {$::tcl_platform(platform)!="unix" || [info commands test_syscall]==""} {
    22    finish_test
    23    return
    24  } 
    25  set testprefix unixexcl
    26  
    27  
    28  
    29  # Test that when using VFS "unix-excl", the first time the database is read
    30  # a process-wide exclusive lock is taken on it. This means other connections
    31  # within the process may still access the db normally, but connections from
    32  # outside the process cannot.
    33  #
    34  do_multiclient_test tn {
    35    do_test unixexcl-1.$tn.1 {
    36      sql1 {
    37        CREATE TABLE t1(a, b);
    38        INSERT INTO t1 VALUES('hello', 'world');
    39      }
    40    } {}
    41    do_test unixexcl-1.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world}
    42    do_test unixexcl-1.$tn.3 {
    43      code1 {
    44        db close
    45        sqlite3 db test.db -vfs unix-excl
    46        db eval { SELECT * FROM t1 }
    47      }
    48    } {hello world}
    49    if {$tn==1} {
    50      do_test unixexcl-1.$tn.4.multiproc { 
    51        csql2 { SELECT * FROM t1 } 
    52      } {1 {database is locked}}
    53    } else {
    54      do_test unixexcl-1.$tn.4.singleproc { 
    55        csql2 { SELECT * FROM t1 } 
    56      } {0 {hello world}}
    57    }
    58  }
    59  
    60  # Test that when using VFS "unix-excl", if a file is opened in read-only mode
    61  # the behaviour is the same as if VFS "unix" were used.
    62  #
    63  do_multiclient_test tn {
    64    do_test unixexcl-2.$tn.1 {
    65      sql1 {
    66        CREATE TABLE t1(a, b);
    67        INSERT INTO t1 VALUES('hello', 'world');
    68      }
    69    } {}
    70    do_test unixexcl-2.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world}
    71    do_test unixexcl-2.$tn.3 {
    72      code1 {
    73        db close
    74        sqlite3 db test.db -readonly yes -vfs unix-excl
    75        db eval { SELECT * FROM t1 }
    76      }
    77    } {hello world}
    78    do_test unixexcl-2.$tn.4 { 
    79      csql2 { SELECT * FROM t1 } 
    80    } {0 {hello world}}
    81  }
    82  
    83  do_multiclient_test tn {
    84    do_test unixexcl-3.$tn.1 {
    85      code1 { db close; sqlite3 db file:test.db?psow=0 -vfs unix-excl -uri 1 }
    86      code2 { db2 close; sqlite3 db2 file:test.db?psow=0 -vfs unix-excl -uri 1 }
    87      sql1 {
    88        PRAGMA auto_vacuum = 0;
    89        PRAGMA journal_mode = WAL;
    90        PRAGMA synchronous = FULL;
    91        CREATE TABLE t1(a, b);
    92        INSERT INTO t1 VALUES(1, 2);
    93      }
    94    } {wal}
    95  
    96    if {$tn==1} {
    97      do_test unixexcl-3.$tn.1.multiproc {
    98        csql2 { SELECT * FROM t1; }
    99      } {1 {database is locked}}
   100    } else {
   101      do_test unixexcl-3.$tn.1.singleproc {
   102        sql2 { SELECT * FROM t1; }
   103      } {1 2}
   104  
   105      do_test unixexcl-3.$tn.2 {
   106        sql2 { 
   107          BEGIN;
   108            SELECT * FROM t1;
   109        }
   110      } {1 2}
   111      do_test unixexcl-3.$tn.3 {
   112        sql1 { PRAGMA wal_checkpoint; INSERT INTO t1 VALUES(3, 4); }
   113      } {0 5 5}
   114      do_test unixexcl-3.$tn.4 {
   115        sql2 { SELECT * FROM t1; }
   116      } {1 2}
   117      do_test unixexcl-3.$tn.5 {
   118        sql1 { SELECT * FROM t1; }
   119      } {1 2 3 4}
   120      do_test unixexcl-3.$tn.6 {
   121        sql2 { COMMIT; SELECT * FROM t1; }
   122      } {1 2 3 4}
   123      do_test unixexcl-3.$tn.7 {
   124        sql1 { PRAGMA wal_checkpoint; }
   125      } {0 7 7}
   126    }
   127  }
   128  
   129  finish_test