/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.store; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.h2.constant.ErrorCode; import org.h2.engine.Constants; import org.h2.message.DbException; import org.h2.message.TraceSystem; import org.h2.store.fs.FileUtils; import org.h2.util.New; /** * Utility class to list the files of a database. */ public class FileLister { private FileLister() { // utility class } /** * Try to lock the database, and then unlock it. If this worked, the * .lock.db file will be removed. * * @param files the database files to check * @param message the text to include in the error message * @throws SQLException if it failed */ public static void tryUnlockDatabase(List<String> files, String message) throws SQLException { for (String fileName : files) { if (fileName.endsWith(Constants.SUFFIX_LOCK_FILE)) { FileLock lock = new FileLock(new TraceSystem(null), fileName, Constants.LOCK_SLEEP); try { lock.lock(FileLock.LOCK_FILE); lock.unlock(); } catch (DbException e) { throw DbException.get( ErrorCode.CANNOT_CHANGE_SETTING_WHEN_OPEN_1, message).getSQLException(); } } } } /** * Normalize the directory name. * * @param dir the directory (null for the current directory) * @return the normalized directory name */ public static String getDir(String dir) { if (dir == null || dir.equals("")) { return "."; } return FileUtils.toRealPath(dir); } /** * Get the list of database files. * * @param dir the directory (must be normalized) * @param db the database name (null for all databases) * @param all if true, files such as the lock, trace, and lob * files are included. If false, only data, index, log, * and lob files are returned * @return the list of files */ public static ArrayList<String> getDatabaseFiles(String dir, String db, boolean all) { ArrayList<String> files = New.arrayList(); // for Windows, File.getCanonicalPath("...b.") returns just "...b" String start = db == null ? null : (FileUtils.toRealPath(dir + "/" + db) + "."); for (String f : FileUtils.newDirectoryStream(dir)) { boolean ok = false; if (f.endsWith(Constants.SUFFIX_LOBS_DIRECTORY)) { if (start == null || f.startsWith(start)) { files.addAll(getDatabaseFiles(f, null, all)); ok = true; } } else if (f.endsWith(Constants.SUFFIX_LOB_FILE)) { ok = true; } else if (f.endsWith(Constants.SUFFIX_PAGE_FILE)) { ok = true; } else if (all) { if (f.endsWith(Constants.SUFFIX_LOCK_FILE)) { ok = true; } else if (f.endsWith(Constants.SUFFIX_TEMP_FILE)) { ok = true; } else if (f.endsWith(Constants.SUFFIX_TRACE_FILE)) { ok = true; } } if (ok) { if (db == null || f.startsWith(start)) { String fileName = f; files.add(fileName); } } } return files; } }