From 167a4b1c9073b10d265e190fc2fc7fd970c7b987 Mon Sep 17 00:00:00 2001
From: drh
Date: Thu, 17 Aug 2000 09:49:59 +0000
Subject: [PATCH] allow readonly access when write permission denied (CVS 131)
FossilOrigin-Name: 897b4bc0e92a2c7534d4fa9453a7f8f863fce67a
---
manifest | 22 +++++++++++-----------
manifest.uuid | 2 +-
src/dbbe.c | 13 +++++++++----
src/dbbe.h | 4 ++--
src/shell.c | 15 ++++++++++-----
src/tclsqlite.c | 3 ++-
test/dbbe.test | 4 ++--
www/changes.tcl | 6 ++++++
8 files changed, 43 insertions(+), 26 deletions(-)
diff --git a/manifest b/manifest
index 53f7b5d18c..b3b44ccd92 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C bug\sfix\s(CVS\s130)
-D 2000-08-09T17:17:25
+C allow\sreadonly\saccess\swhen\swrite\spermission\sdenied\s(CVS\s131)
+D 2000-08-17T09:50:00
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
F Makefile.in 670aa9413cb2cdcded23b328a9e255c845c41a1e
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
@@ -7,19 +7,19 @@ F configure 51063d594190fa085f909cefc9427241088bec4f x
F configure.in a04f02ba61ed09a00e862b4f78b91b06a559e0b5
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
F src/build.c 4d90e9e94750ca80249fc7958c617021d8bb7a50
-F src/dbbe.c 5c69d68fe8d9461e56d066f9a7f693636c02d0c7
-F src/dbbe.h 8718b718b36d37584e9bbdfccec10588fa91271f
+F src/dbbe.c 226daaf8c095ceb4aff48cad188dad90643f9867
+F src/dbbe.h 6337132f904e72ecb28b07390021c241397e4cbf
F src/delete.c 4d491eaf61b515516749c7ed68fa3b2ee8a09065
F src/expr.c 2fa63f086707176d09092e71832f9bbdc6a8ac85
F src/insert.c f146f149ad2422a1dc3bfa7a1651a25940f98958
F src/main.c ba16b81890d962821bb90f0a4de9a29b0e495eb2
F src/parse.y 5d199034de5d29ebedb42c1c51f34db4df40cbe5
F src/select.c d382e96c2221d08367cc87976f2b574537c9de97
-F src/shell.c cd560887be6fb9cfa477fce7ba60716139189271
+F src/shell.c 0aabf9e5e89fc8ac7a56de7f05255ed6864170f2
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
F src/sqlite.h 82ae53028e27919250f886ff9d7c4927de81978a
F src/sqliteInt.h f6d1e139b3bfa4ceff2136684e19d76b53178ec0
-F src/tclsqlite.c b1ae6abd50d8b0e2470cc49b5e1d03329a68dd75
+F src/tclsqlite.c 89dc4ba2b521f3e919d6d7aaa4cc1c2aba8e16f3
F src/tokenize.c 097bec5843d4a0fb4509e036fee93bac080c5e73
F src/update.c 51b9ef7434b15e31096155da920302e9db0d27fc
F src/util.c b75b33e6bd5d47898bb7ed9fdd0dea4fe7c19b00
@@ -28,7 +28,7 @@ F src/vdbe.h 6c5653241633c583549c2d8097394ab52550eb63
F src/where.c 420f666a38b405cd58bd7af832ed99f1dbc7d336
F test/all.test 0950c135cab7e60c07bd745ccfad1476211e5bd7
F test/copy.test b77a1214bd7756f2849d5c4fa6e715c0ff0c34eb
-F test/dbbe.test 0a8e4293cf816e590dcbb01be4cd4e8f7f95bdc8
+F test/dbbe.test c6079572516aeb2739a35fd272b105c45c30cc76
F test/delete.test 402ee3ccb6e544582d24c573ef70b34d09583ae7
F test/expr.test 09b55ccf81cb8cc2f9cd83d592a2ba187ee48ba8
F test/in.test 2c560c0f55fb777029fd9bb5378f2997582aa603
@@ -60,7 +60,7 @@ F www/arch.fig 4e26e9dca3c49724fc8f554c695ddea9f2413156
F www/arch.png c4d908b79065a72e7dcf19317f36d1324c550e87
F www/arch.tcl 4f6a9afecc099a27bba17b4f8cc9561abc15dc40
F www/c_interface.tcl 29593cf77025bab137b7ba64b9459eb5eb6b4873
-F www/changes.tcl 93793b1f28248282fcd3c953f46c78ee7c5819f0
+F www/changes.tcl ebea5c4eeeb210d118d002a2fbc84c8fba5af7e2
F www/crosscompile.tcl 19734ce7f18b16ff2ed8479412abf8aca56e1dcc
F www/fileformat.tcl cfb7fba80b7275555281ba2f256c00734bcdd1c9
F www/index.tcl 421bcabc6839eb00698b75b169caa8a559454515
@@ -69,7 +69,7 @@ F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
F www/sqlite.tcl cb0d23d8f061a80543928755ec7775da6e4f362f
F www/vdbe.tcl bcbfc33bcdd0ebad95eab31286adb9e1bc289520
-P 2b3511eca7e562ef2428cec2f7eeca1d26b6c1c8
-R feae1ba062714e41beac70a905f9d7a4
+P e8882dac2306afbc7bffdaa93c9a7fc45fdbd8e1
+R 84cf4ce23b5394480238cc25bd273361
U drh
-Z 9ca7c4666791da386e3fb1b846e0d62e
+Z 4e8cb91c77f87e4664b844fede982b96
diff --git a/manifest.uuid b/manifest.uuid
index 1554b72d37..57adeab56f 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-e8882dac2306afbc7bffdaa93c9a7fc45fdbd8e1
\ No newline at end of file
+897b4bc0e92a2c7534d4fa9453a7f8f863fce67a
\ No newline at end of file
diff --git a/src/dbbe.c b/src/dbbe.c
index e34ffd91d6..b9271ad678 100644
--- a/src/dbbe.c
+++ b/src/dbbe.c
@@ -30,7 +30,7 @@
** relatively simple to convert to a different database such
** as NDBM, SDBM, or BerkeleyDB.
**
-** $Id: dbbe.c,v 1.18 2000/08/02 12:26:29 drh Exp $
+** $Id: dbbe.c,v 1.19 2000/08/17 09:50:00 drh Exp $
*/
#include "sqliteInt.h"
#include
@@ -372,6 +372,8 @@ int sqliteDbbeOpenCursor(
/* Trying to read a non-existant file. This is OK. All the
** reads will return empty, which is what we want. */
rc = SQLITE_OK;
+ }else if( pBe->write==0 ){
+ rc = SQLITE_READONLY;
}else if( access(zFile,W_OK|R_OK) ){
rc = SQLITE_PERM;
}else{
@@ -413,11 +415,13 @@ void sqliteDbbeDropTable(Dbbe *pBe, const char *zTable){
/*
** Reorganize a table to reduce search times and disk usage.
*/
-void sqliteDbbeReorganizeTable(Dbbe *pBe, const char *zTable){
+int sqliteDbbeReorganizeTable(Dbbe *pBe, const char *zTable){
DbbeCursor *pCrsr;
+ int rc;
- if( sqliteDbbeOpenCursor(pBe, zTable, 1, &pCrsr)!=SQLITE_OK ){
- return;
+ rc = sqliteDbbeOpenCursor(pBe, zTable, 1, &pCrsr);
+ if( rc!=SQLITE_OK ){
+ return rc;
}
if( pCrsr && pCrsr->pFile && pCrsr->pFile->dbf ){
gdbm_reorganize(pCrsr->pFile->dbf);
@@ -425,6 +429,7 @@ void sqliteDbbeReorganizeTable(Dbbe *pBe, const char *zTable){
if( pCrsr ){
sqliteDbbeCloseCursor(pCrsr);
}
+ return SQLITE_OK;
}
/*
diff --git a/src/dbbe.h b/src/dbbe.h
index 8ccb53f18f..329cef3c5c 100644
--- a/src/dbbe.h
+++ b/src/dbbe.h
@@ -28,7 +28,7 @@
** This library was originally designed to support the following
** backends: GDBM, NDBM, SDBM, Berkeley DB.
**
-** $Id: dbbe.h,v 1.6 2000/06/21 13:59:11 drh Exp $
+** $Id: dbbe.h,v 1.7 2000/08/17 09:50:00 drh Exp $
*/
#ifndef _SQLITE_DBBE_H_
#define _SQLITE_DBBE_H_
@@ -79,7 +79,7 @@ int sqliteDbbeOpenCursor(Dbbe*, const char *zName, int writeable, DbbeCursor**);
void sqliteDbbeDropTable(Dbbe*, const char *zTableName);
/* Reorganize a table to speed access or reduce its disk usage */
-void sqliteDbbeReorganizeTable(Dbbe*, const char *zTableName);
+int sqliteDbbeReorganizeTable(Dbbe*, const char *zTableName);
/* Close a cursor */
void sqliteDbbeCloseCursor(DbbeCursor*);
diff --git a/src/shell.c b/src/shell.c
index 629d100838..6dcdccce7b 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -24,7 +24,7 @@
** This file contains code to implement the "sqlite" command line
** utility for accessing SQLite databases.
**
-** $Id: shell.c,v 1.20 2000/08/08 20:19:09 drh Exp $
+** $Id: shell.c,v 1.21 2000/08/17 09:50:00 drh Exp $
*/
#include
#include
@@ -659,12 +659,17 @@ int main(int argc, char **argv){
}
data.db = db = sqlite_open(argv[1], 0666, &zErrMsg);
if( db==0 ){
- if( zErrMsg ){
- fprintf(stderr,"Unable to open database \"%s\": %s\n", argv[1], zErrMsg);
+ data.db = db = sqlite_open(argv[1], 0444, &zErrMsg);
+ if( db==0 ){
+ if( zErrMsg ){
+ fprintf(stderr,"Unable to open database \"%s\": %s\n", argv[1],zErrMsg);
+ }else{
+ fprintf(stderr,"Unable to open database %s\n", argv[1]);
+ }
+ exit(1);
}else{
- fprintf(stderr,"Unable to open database %s\n", argv[1]);
+ printf("Database \"%s\" opened READ ONLY!\n", argv[1]);
}
- exit(1);
}
data.out = stdout;
if( argc==3 ){
diff --git a/src/tclsqlite.c b/src/tclsqlite.c
index dc9894c71e..11221a7693 100644
--- a/src/tclsqlite.c
+++ b/src/tclsqlite.c
@@ -23,7 +23,7 @@
*************************************************************************
** A TCL Interface to SQLite
**
-** $Id: tclsqlite.c,v 1.7 2000/08/04 14:56:25 drh Exp $
+** $Id: tclsqlite.c,v 1.8 2000/08/17 09:50:00 drh Exp $
*/
#include "sqlite.h"
#include
@@ -329,6 +329,7 @@ static int DbMain(void *cd, Tcl_Interp *interp, int argc, char **argv){
*/
int Sqlite_Init(Tcl_Interp *interp){
Tcl_CreateCommand(interp, "sqlite", DbMain, 0, 0);
+ Tcl_PkgProvide(interp, "sqlite", "1.0");
return TCL_OK;
}
int Sqlite_SafeInit(Tcl_Interp *interp){
diff --git a/test/dbbe.test b/test/dbbe.test
index d7c2700e27..3c9104e63f 100644
--- a/test/dbbe.test
+++ b/test/dbbe.test
@@ -23,7 +23,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is exercising the code in dbbe.c.
#
-# $Id: dbbe.test,v 1.2 2000/06/08 15:10:48 drh Exp $
+# $Id: dbbe.test,v 1.3 2000/08/17 09:50:00 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -130,7 +130,7 @@ do_test dbbe-3.1 {
sqlite db testdb 0444
set v [catch {execsql {INSERT INTO t1 VALUES(1)}} msg]
lappend v $msg
-} {1 {write permission denied for table t1}}
+} {1 {table t1 is readonly}}
finish_test
diff --git a/www/changes.tcl b/www/changes.tcl
index 0ca4c7293b..f5ffc41b65 100644
--- a/www/changes.tcl
+++ b/www/changes.tcl
@@ -17,6 +17,12 @@ proc chng {date desc} {
puts "
"
}
+chng {2000 Aug 17} {
+Change the sqlite program so that it can read
+ databases for which it lacks write permission. (It used to
+ refuse all access if it could not write.)
+}
+
chng {2000 Aug 9} {
Treat carriage returns as white space.
}