Search in sources :

Example 1 with FilePathDisk

use of org.h2.store.fs.FilePathDisk in project h2database by h2database.

the class FileStore method open.

/**
 * Try to open the file.
 *
 * @param fileName the file name
 * @param readOnly whether the file should only be opened in read-only mode,
 *            even if the file is writable
 * @param encryptionKey the encryption key, or null if encryption is not
 *            used
 */
public void open(String fileName, boolean readOnly, char[] encryptionKey) {
    if (file != null) {
        return;
    }
    if (fileName != null) {
        // ensure the Cache file system is registered
        FilePathCache.INSTANCE.getScheme();
        FilePath p = FilePath.get(fileName);
        // if no explicit scheme was specified, NIO is used
        if (p instanceof FilePathDisk && !fileName.startsWith(p.getScheme() + ":")) {
            // ensure the NIO file system is registered
            FilePathNio.class.getName();
            fileName = "nio:" + fileName;
        }
    }
    this.fileName = fileName;
    FilePath f = FilePath.get(fileName);
    FilePath parent = f.getParent();
    if (parent != null && !parent.exists()) {
        throw DataUtils.newIllegalArgumentException("Directory does not exist: {0}", parent);
    }
    if (f.exists() && !f.canWrite()) {
        readOnly = true;
    }
    this.readOnly = readOnly;
    try {
        file = f.open(readOnly ? "r" : "rw");
        if (encryptionKey != null) {
            byte[] key = FilePathEncrypt.getPasswordBytes(encryptionKey);
            encryptedFile = file;
            file = new FilePathEncrypt.FileEncrypt(fileName, key, file);
        }
        try {
            if (readOnly) {
                fileLock = file.tryLock(0, Long.MAX_VALUE, true);
            } else {
                fileLock = file.tryLock();
            }
        } catch (OverlappingFileLockException e) {
            throw DataUtils.newIllegalStateException(DataUtils.ERROR_FILE_LOCKED, "The file is locked: {0}", fileName, e);
        }
        if (fileLock == null) {
            throw DataUtils.newIllegalStateException(DataUtils.ERROR_FILE_LOCKED, "The file is locked: {0}", fileName);
        }
        fileSize = file.size();
    } catch (IOException e) {
        throw DataUtils.newIllegalStateException(DataUtils.ERROR_READING_FAILED, "Could not open file {0}", fileName, e);
    }
}
Also used : FilePath(org.h2.store.fs.FilePath) FilePathEncrypt(org.h2.store.fs.FilePathEncrypt) IOException(java.io.IOException) FilePathDisk(org.h2.store.fs.FilePathDisk) OverlappingFileLockException(java.nio.channels.OverlappingFileLockException)

Aggregations

IOException (java.io.IOException)1 OverlappingFileLockException (java.nio.channels.OverlappingFileLockException)1 FilePath (org.h2.store.fs.FilePath)1 FilePathDisk (org.h2.store.fs.FilePathDisk)1 FilePathEncrypt (org.h2.store.fs.FilePathEncrypt)1