]> source.dussan.org Git - jackcess.git/commitdiff
tighten up readonly handling for external channels; minor test code refactor
authorJames Ahlborn <jtahlborn@yahoo.com>
Thu, 10 Jun 2021 21:42:39 +0000 (21:42 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Thu, 10 Jun 2021 21:42:39 +0000 (21:42 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1368 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
src/test/java/com/healthmarketscience/jackcess/TestUtil.java

index 7af0b87c0384f66624187bd3f9c3818d74343e6f..b3f37688e2b94240634f6c7ac1e5a5cc9866c2aa 100644 (file)
@@ -400,17 +400,27 @@ public class DatabaseImpl implements Database, DateTimeContext
     boolean success = false;
     try {
 
+      boolean wrapChannelRO = false;
       if(!readOnly) {
-
         // verify that format supports writing
         JetFormat jetFormat = JetFormat.getFormat(channel);
 
         if(jetFormat.READ_ONLY) {
-          // wrap the channel with a read-only version to enforce
-          // non-writability
-          channel = new ReadOnlyFileChannel(channel);
+          // force read-only mode
+          wrapChannelRO = true;
           readOnly = true;
         }
+      } else if(!closeChannel) {
+        // we are in read-only mode but the channel was opened externally, so
+        // we don't know if it is enforcing read-only status.  wrap it just to
+        // be safe
+        wrapChannelRO = true;
+      }
+
+      if(wrapChannelRO) {
+        // wrap the channel with a read-only version to enforce
+        // non-writability
+        channel = new ReadOnlyFileChannel(channel);
       }
 
       DatabaseImpl db = new DatabaseImpl(mdbFile, channel, closeChannel, autoSync,
index e10fd398d7c9c4db7c977d12adab2bf759b92b5b..f06f89d5d6ebb28490d8ce72eb43953cd3ba835b 100644 (file)
@@ -26,8 +26,8 @@ import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.lang.reflect.Field;
 import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
 import java.nio.channels.FileChannel;
+import java.nio.charset.Charset;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -97,17 +97,7 @@ public class TestUtil
                               Charset charset)
     throws Exception
   {
-    FileChannel channel = (inMem ? MemFileChannel.newChannel(
-                               file, MemFileChannel.RW_CHANNEL_MODE)
-                           : null);
-    final Database db = new DatabaseBuilder(file).setReadOnly(true)
-      .setAutoSync(getTestAutoSync()).setChannel(channel)
-      .setCharset(charset).open();
-    Assert.assertEquals("Wrong JetFormat.",
-                 DatabaseImpl.getFileFormatDetails(fileFormat).getFormat(),
-                 ((DatabaseImpl)db).getFormat());
-    Assert.assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat());
-    return db;
+    return openDB(fileFormat, file, inMem, charset, true);
   }
 
   public static Database open(TestDB testDB) throws Exception {
@@ -116,8 +106,8 @@ public class TestUtil
   }
 
   public static Database openMem(TestDB testDB) throws Exception {
-    return open(testDB.getExpectedFileFormat(), testDB.getFile(), true,
-                testDB.getExpectedCharset());
+    return openDB(testDB.getExpectedFileFormat(), testDB.getFile(), true,
+                    testDB.getExpectedCharset(), false);
   }
 
   public static Database create(FileFormat fileFormat) throws Exception {
@@ -196,15 +186,27 @@ public class TestUtil
   {
     File tmp = createTempFile(keep);
     copyFile(file, tmp);
-    Database db = new DatabaseBuilder(tmp).setAutoSync(getTestAutoSync()).open();
+    return openDB(fileFormat, tmp, false, null, false);
+  }
+
+  private static Database openDB(
+      FileFormat fileFormat, File file, boolean inMem, Charset charset,
+      boolean readOnly)
+    throws Exception
+  {
+    FileChannel channel = (inMem ? MemFileChannel.newChannel(
+                               file, MemFileChannel.RW_CHANNEL_MODE)
+                           : null);
+    final Database db = new DatabaseBuilder(file).setReadOnly(readOnly)
+      .setAutoSync(getTestAutoSync()).setChannel(channel)
+      .setCharset(charset).open();
     Assert.assertEquals("Wrong JetFormat.",
-                 DatabaseImpl.getFileFormatDetails(fileFormat).getFormat(),
-                 ((DatabaseImpl)db).getFormat());
+                        DatabaseImpl.getFileFormatDetails(fileFormat).getFormat(),
+                        ((DatabaseImpl)db).getFormat());
     Assert.assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat());
     return db;
   }
 
-
   static Object[] createTestRow(String col1Val) {
     return new Object[] {col1Val, "R", "McCune", 1234, (byte) 0xad, 555.66d,
         777.88f, (short) 999, new Date()};