Index: src/btree.c ================================================================== --- src/btree.c +++ src/btree.c @@ -7,11 +7,11 @@ ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.356 2007/04/19 00:24:34 drh Exp $ +** $Id: btree.c,v 1.357 2007/04/24 17:27:51 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to ** ** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: @@ -1868,11 +1868,14 @@ if( sqlite3PagerPagecount(pBt->pPager)>0 ){ u8 *page1 = pPage1->aData; if( memcmp(page1, zMagicHeader, 16)!=0 ){ goto page1_init_failed; } - if( page1[18]>1 || page1[19]>1 ){ + if( page1[18]>1 ){ + pBt->readOnly = 1; + } + if( page1[19]>1 ){ goto page1_init_failed; } pageSize = get2byte(&page1[16]); if( ((pageSize-1)&pageSize)!=0 || pageSize<512 ){ goto page1_init_failed; @@ -2066,15 +2069,19 @@ do { if( pBt->pPage1==0 ){ rc = lockBtree(pBt); } - + if( rc==SQLITE_OK && wrflag ){ - rc = sqlite3PagerBegin(pBt->pPage1->pDbPage, wrflag>1); - if( rc==SQLITE_OK ){ - rc = newDatabase(pBt); + if( pBt->readOnly ){ + rc = SQLITE_READONLY; + }else{ + rc = sqlite3PagerBegin(pBt->pPage1->pDbPage, wrflag>1); + if( rc==SQLITE_OK ){ + rc = newDatabase(pBt); + } } } if( rc==SQLITE_OK ){ if( wrflag ) pBt->inStmt = 0; ADDED test/rdonly.test Index: test/rdonly.test ================================================================== --- /dev/null +++ test/rdonly.test @@ -0,0 +1,65 @@ +# 2007 April 24 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# +# This file implements tests to make sure SQLite treats a database +# as readonly if its write version is set to high. +# +# $Id: rdonly.test,v 1.1 2007/04/24 17:27:52 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + + +# Create a database. +# +do_test rdonly-1.1 { + execsql { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1); + SELECT * FROM t1; + } +} {1} + +# Changes the write version from 1 to 2. Verify that the database +# can be read but not written. +# +do_test rdonly-1.2 { + db close + hexio_get_int [hexio_read test.db 18 1] +} 1 +do_test rdonly-1.3 { + hexio_write test.db 18 02 + sqlite3 db test.db + execsql { + SELECT * FROM t1; + } +} {1} +do_test rdonly-1.4 { + catchsql { + INSERT INTO t1 VALUES(2) + } +} {1 {attempt to write a readonly database}} + +# Change the write version back to 1. Verify that the database +# is read-write again. +# +do_test rdonly-1.5 { + db close + hexio_write test.db 18 01 + sqlite3 db test.db + catchsql { + INSERT INTO t1 VALUES(2); + SELECT * FROM t1; + } +} {0 {1 2}} + +finish_test