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,
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;
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 {
}
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 {
{
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()};