]> source.dussan.org Git - jackcess.git/commitdiff
automatically switch to read-only mode when opening a file format which does not...
authorJames Ahlborn <jtahlborn@yahoo.com>
Sat, 12 Nov 2016 03:07:30 +0000 (03:07 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sat, 12 Nov 2016 03:07:30 +0000 (03:07 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1055 f203690c-595d-4dc9-a70b-905162fa7fd2

src/changes/changes.xml
src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
src/test/java/com/healthmarketscience/jackcess/impl/JetFormatTest.java

index 73cf393a84c56edc7d1e331b6753655ea315c411..3e58c168718ff4a659c98caea431cf9bd83d4ccf 100644 (file)
@@ -4,6 +4,14 @@
     <author email="javajedi@users.sf.net">Tim McCune</author>
   </properties>
   <body>
+    <release version="2.1.6" date="TBD">
+      <action dev="jahlborn" type="update" system="SourceForge2Features"
+              issue="34">
+        When opening a database for a format which is read-only, automatically
+        open the channel as read-only (instead of throwing an exception if
+        readOnly is false).
+      </action>
+    </release>
     <release version="2.1.5" date="2016-10-03">
       <action dev="jahlborn" type="update">
         Change multi-value complex columns so that they return all relevant
index dc5ecbf0fa412462e6f19ef04114456ed85b260f..ab01d0b519e0a4773d8e25698962804518311d9c 100644 (file)
@@ -389,9 +389,18 @@ public class DatabaseImpl implements Database
         JetFormat jetFormat = JetFormat.getFormat(channel);
 
         if(jetFormat.READ_ONLY) {
-          throw new IOException("file format " + 
-                                jetFormat.getPossibleFileFormats().values() +
-                                " does not support writing for " + mdbFile);
+
+          if(closeChannel) {
+            // we own the channel, close and re-open read only
+            ByteUtil.closeQuietly(channel);
+            channel = null;
+            readOnly = true;
+            channel = openChannel(mdbFile, readOnly);
+          } else {
+            throw new IOException("file format " + 
+                                  jetFormat.getPossibleFileFormats().values() +
+                                  " does not support writing for " + mdbFile);
+          }
         }
       }
 
index 93c5ca974bbdc5096c701f3395f3a8c8b9449846..4efbd60b0f08b8033c90b515f8c75a0da75b18ac 100644 (file)
@@ -1,8 +1,8 @@
 package com.healthmarketscience.jackcess.impl;
 
 import java.io.File;
-import java.io.IOException;
 import java.nio.channels.FileChannel;
+import java.nio.channels.NonWritableChannelException;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
@@ -11,6 +11,7 @@ import java.util.Set;
 import com.healthmarketscience.jackcess.Database;
 import static com.healthmarketscience.jackcess.Database.*;
 import com.healthmarketscience.jackcess.DatabaseBuilder;
+import com.healthmarketscience.jackcess.PropertyMap;
 import junit.framework.TestCase;
 import static com.healthmarketscience.jackcess.TestUtil.*;
 
@@ -208,10 +209,17 @@ public class JetFormatTest extends TestCase {
     for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
 
       Database db = null;
-      IOException failure = null;
+      Exception failure = null;
       try {
         db = openCopy(testDB);
-      } catch(IOException e) {
+
+        if(testDB.getExpectedFormat().READ_ONLY) {
+          PropertyMap props = db.getUserDefinedProperties();
+          props.put("foo", "bar");
+          props.save();
+        } 
+
+      } catch(Exception e) {
         failure = e;
       } finally {
         if(db != null) {
@@ -222,7 +230,7 @@ public class JetFormatTest extends TestCase {
       if(!testDB.getExpectedFormat().READ_ONLY) {
         assertNull(failure);
       } else {
-        assertTrue(failure.getMessage().contains("does not support writing"));
+        assertTrue(failure instanceof NonWritableChannelException);
       }
 
     }