1 # 2005 October 3 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. 12 # 13 # This file implements tests the ability of the library to open 14 # many different databases at the same time without leaking memory. 15 # 16 # $Id: manydb.test,v 1.4 2008/11/21 00:10:35 aswift Exp $ 17 18 set testdir [file dirname $argv0] 19 source $testdir/tester.tcl 20 21 set N 300 22 # if we're using proxy locks, we use 5 filedescriptors for a db 23 # that is open and in the middle of writing changes, normally 24 # sqlite uses 3 (proxy locking adds the conch and the local lock) 25 set using_proxy 0 26 foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] { 27 set using_proxy value 28 } 29 set num_fd_per_openwrite_db 3 30 if {$using_proxy>0} { 31 set num_fd_per_openwrite_db 5 32 } 33 34 # First test how many file descriptors are available for use. To open a 35 # database for writing SQLite requires 3 file descriptors (the database, the 36 # journal and the directory). 37 set filehandles {} 38 catch { 39 for {set i 0} {$i<($N * 3)} {incr i} { 40 lappend filehandles [open testfile.1 w] 41 } 42 } 43 foreach fd $filehandles { 44 close $fd 45 } 46 catch { 47 file delete -force testfile.1 48 } 49 set N [expr $i / $num_fd_per_openwrite_db] 50 51 # Create a bunch of random database names 52 # 53 unset -nocomplain dbname 54 unset -nocomplain used 55 for {set i 0} {$i<$N} {incr i} { 56 while 1 { 57 set name test-[format %08x [expr {int(rand()*0x7fffffff)}]].db 58 if {[info exists used($name)]} continue 59 set dbname($i) $name 60 set used($name) $i 61 break 62 } 63 } 64 65 # Create a bunch of databases 66 # 67 for {set i 0} {$i<$N} {incr i} { 68 do_test manydb-1.$i { 69 sqlite3 db$i $dbname($i) 70 execsql { 71 CREATE TABLE t1(a,b); 72 BEGIN; 73 INSERT INTO t1 VALUES(1,2); 74 } db$i 75 } {} 76 } 77 78 # Finish the transactions 79 # 80 for {set i 0} {$i<$N} {incr i} { 81 do_test manydb-2.$i { 82 execsql { 83 COMMIT; 84 SELECT * FROM t1; 85 } db$i 86 } {1 2} 87 } 88 89 90 # Close the databases and erase the files. 91 # 92 for {set i 0} {$i<$N} {incr i} { 93 do_test manydb-3.$i { 94 db$i close 95 file delete -force $dbname($i) 96 } {} 97 } 98 99 100 101 102 finish_test 103