提交 8cd6f45c authored 作者: Thomas Mueller's avatar Thomas Mueller

Improved error message.

上级 aa7a9f02
...@@ -17,10 +17,10 @@ import org.h2.util.IOUtils; ...@@ -17,10 +17,10 @@ import org.h2.util.IOUtils;
/** /**
* FileObject which is using NIO MappedByteBuffer mapped to memory from file. * FileObject which is using NIO MappedByteBuffer mapped to memory from file.
* The file size is limited to 2 GB.
*/ */
public class FileObjectDiskMapped implements FileObject { public class FileObjectDiskMapped implements FileObject {
// TODO support files over 2 GB by using multiple buffers
private static final long GC_TIMEOUT_MS = 10000; private static final long GC_TIMEOUT_MS = 10000;
private final String name; private final String name;
private final MapMode mode; private final MapMode mode;
...@@ -82,24 +82,28 @@ public class FileObjectDiskMapped implements FileObject { ...@@ -82,24 +82,28 @@ public class FileObjectDiskMapped implements FileObject {
* was created. * was created.
*/ */
private void reMap() throws IOException { private void reMap() throws IOException {
if (file.length() > Integer.MAX_VALUE) {
throw new IOException("File over 2GB is not supported yet");
}
int oldPos = 0; int oldPos = 0;
if (mapped != null) { if (mapped != null) {
oldPos = mapped.position(); oldPos = mapped.position();
mapped.force(); mapped.force();
unMap(); unMap();
} }
long length = file.length();
checkFileLength(length);
// maps new MappedByteBuffer, old one is disposed during GC // maps new MappedByteBuffer, old one is disposed during GC
mapped = file.getChannel().map(mode, 0, file.length()); mapped = file.getChannel().map(mode, 0, length);
if (SysProperties.NIO_LOAD_MAPPED) { if (SysProperties.NIO_LOAD_MAPPED) {
mapped.load(); mapped.load();
} }
mapped.position(oldPos); mapped.position(oldPos);
} }
private void checkFileLength(long length) throws IOException {
if (length > Integer.MAX_VALUE) {
throw new IOException("File over 2GB is not supported yet when using this file system");
}
}
public void close() throws IOException { public void close() throws IOException {
unMap(); unMap();
file.close(); file.close();
...@@ -122,11 +126,13 @@ public class FileObjectDiskMapped implements FileObject { ...@@ -122,11 +126,13 @@ public class FileObjectDiskMapped implements FileObject {
mapped.get(b, off, len); mapped.get(b, off, len);
} }
public void seek(long pos) { public void seek(long pos) throws IOException {
checkFileLength(pos);
mapped.position((int) pos); mapped.position((int) pos);
} }
public void setFileLength(long newLength) throws IOException { public void setFileLength(long newLength) throws IOException {
checkFileLength(newLength);
IOUtils.setLength(file, newLength); IOUtils.setLength(file, newLength);
reMap(); reMap();
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论