aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Ahlborn <jtahlborn@yahoo.com>2021-06-10 21:42:39 +0000
committerJames Ahlborn <jtahlborn@yahoo.com>2021-06-10 21:42:39 +0000
commit1ff24f80a1308c43bba7a6035b6d1d830c141545 (patch)
treeb3492f81293a3ad4d93f92b056de62f7252c3557
parentd52519607f1d944aed33008be62a3bbfcf05ae52 (diff)
downloadjackcess-1ff24f80a1308c43bba7a6035b6d1d830c141545.tar.gz
jackcess-1ff24f80a1308c43bba7a6035b6d1d830c141545.zip
tighten up readonly handling for external channels; minor test code refactor
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1368 f203690c-595d-4dc9-a70b-905162fa7fd2
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java18
-rw-r--r--src/test/java/com/healthmarketscience/jackcess/TestUtil.java38
2 files changed, 34 insertions, 22 deletions
diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
index 7af0b87..b3f3768 100644
--- a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
+++ b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
@@ -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,
diff --git a/src/test/java/com/healthmarketscience/jackcess/TestUtil.java b/src/test/java/com/healthmarketscience/jackcess/TestUtil.java
index e10fd39..f06f89d 100644
--- a/src/test/java/com/healthmarketscience/jackcess/TestUtil.java
+++ b/src/test/java/com/healthmarketscience/jackcess/TestUtil.java
@@ -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()};