📄 filesystemdatabase.java
字号:
}
}
public String createTempFile(String name, String suffix, boolean deleteOnExit, boolean inTempDir) throws IOException {
name = translateFileName(name);
name += ".";
for (int i = 0;; i++) {
String n = name + i + suffix;
if (!exists(n)) {
// creates the file (not thread safe)
openFileObject(n, "rw").close();
return n;
}
}
}
public synchronized void delete(String fileName) throws SQLException {
try {
long id = getId(fileName, false);
PreparedStatement prep = prepare("DELETE FROM FILES WHERE ID=?");
prep.setLong(1, id);
prep.execute();
prep = prepare("DELETE FROM FILEDATA WHERE ID=?");
prep.setLong(1, id);
prep.execute();
commit();
} catch (SQLException e) {
rollback();
throw convert(e);
}
}
public void deleteRecursive(String fileName) throws SQLException {
throw Message.getUnsupportedException();
}
public boolean exists(String fileName) {
long id = getId(fileName, false);
return id >= 0;
}
public boolean fileStartsWith(String fileName, String prefix) {
fileName = translateFileName(fileName);
return fileName.startsWith(prefix);
}
public String getAbsolutePath(String fileName) {
return fileName;
}
public String getFileName(String fileName) throws SQLException {
fileName = translateFileName(fileName);
String[] path = StringUtils.arraySplit(fileName, '/', false);
return path[path.length - 1];
}
public synchronized long getLastModified(String fileName) {
try {
long id = getId(fileName, false);
PreparedStatement prep = prepare("SELECT LASTMODIFIED FROM FILES WHERE ID=?");
prep.setLong(1, id);
ResultSet rs = prep.executeQuery();
rs.next();
return rs.getLong(1);
} catch (SQLException e) {
throw convert(e);
}
}
public String getParent(String fileName) {
int idx = Math.max(fileName.indexOf(':'), fileName.lastIndexOf('/'));
return fileName.substring(0, idx);
}
public boolean isAbsolute(String fileName) {
return true;
}
public synchronized boolean isDirectory(String fileName) {
try {
long id = getId(fileName, false);
PreparedStatement prep = prepare("SELECT LENGTH FROM FILES WHERE ID=?");
prep.setLong(1, id);
ResultSet rs = prep.executeQuery();
rs.next();
rs.getLong(1);
return rs.wasNull();
} catch (SQLException e) {
throw convert(e);
}
}
public boolean isReadOnly(String fileName) {
return false;
}
public synchronized long length(String fileName) {
try {
long id = getId(fileName, false);
PreparedStatement prep = prepare("SELECT LENGTH FROM FILES WHERE ID=?");
prep.setLong(1, id);
ResultSet rs = prep.executeQuery();
rs.next();
return rs.getLong(1);
} catch (SQLException e) {
throw convert(e);
}
}
public synchronized String[] listFiles(String path) throws SQLException {
try {
String name = path;
if (!name.endsWith("/")) {
name += "/";
}
long id = getId(path, false);
PreparedStatement prep = prepare("SELECT NAME FROM FILES WHERE PARENTID=? ORDER BY NAME");
prep.setLong(1, id);
ResultSet rs = prep.executeQuery();
ArrayList list = new ArrayList();
while (rs.next()) {
list.add(name + rs.getString(1));
}
String[] result = new String[list.size()];
list.toArray(result);
return result;
} catch (SQLException e) {
throw convert(e);
}
}
public String normalize(String fileName) throws SQLException {
return fileName;
}
public InputStream openFileInputStream(String fileName) throws IOException {
return new FileObjectInputStream(openFileObject(fileName, "r"));
}
public FileObject openFileObject(String fileName, String mode) throws IOException {
try {
long id = getId(fileName, false);
PreparedStatement prep = prepare("SELECT DATA FROM FILEDATA WHERE ID=?");
prep.setLong(1, id);
ResultSet rs = prep.executeQuery();
if (rs.next()) {
InputStream in = rs.getBinaryStream(1);
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copyAndClose(in, out);
byte[] data = out.toByteArray();
return new FileObjectDatabase(this, fileName, data, false);
} else {
return new FileObjectDatabase(this, fileName, new byte[0], true);
}
} catch (SQLException e) {
throw convert(e);
}
}
public OutputStream openFileOutputStream(String fileName, boolean append) throws SQLException {
try {
return new FileObjectOutputStream(openFileObject(fileName, "rw"), append);
} catch (IOException e) {
throw Message.convertIOException(e, fileName);
}
}
public synchronized void rename(String oldName, String newName) throws SQLException {
try {
long parentOld = getId(oldName, true);
long parentNew = getId(newName, true);
if (parentOld != parentNew) {
throw Message.getUnsupportedException();
}
newName = getFileName(newName);
long id = getId(oldName, false);
PreparedStatement prep = prepare("UPDATE FILES SET NAME=? WHERE ID=?");
prep.setString(1, newName);
prep.setLong(2, id);
prep.execute();
commit();
} catch (SQLException e) {
rollback();
throw convert(e);
}
}
public boolean tryDelete(String fileName) {
try {
delete(fileName);
} catch (SQLException e) {
return false;
}
return true;
}
synchronized void write(String fileName, byte[] b, int len) throws IOException {
try {
long id = getId(fileName, false);
if (id >= 0) {
PreparedStatement prep = prepare("DELETE FROM FILES WHERE ID=?");
prep.setLong(1, id);
prep.execute();
prep = prepare("DELETE FROM FILEDATA WHERE ID=?");
prep.setLong(1, id);
prep.execute();
}
long parentId = getId(fileName, true);
PreparedStatement prep = prepare("INSERT INTO FILES(PARENTID, NAME, LASTMODIFIED) VALUES(?, ?, ?)");
prep.setLong(1, parentId);
prep.setString(2, getFileName(fileName));
prep.setLong(3, System.currentTimeMillis());
prep.execute();
ResultSet rs = JdbcUtils.getGeneratedKeys(prep);
rs.next();
id = rs.getLong(1);
prep = prepare("INSERT INTO FILEDATA(ID, DATA) VALUES(?, ?)");
prep.setLong(1, id);
ByteArrayInputStream in = new ByteArrayInputStream(b, 0, len);
prep.setBinaryStream(2, in, -1);
prep.execute();
prep = prepare("UPDATE FILES SET LENGTH=(SELECT LENGTH(DATA) FROM FILEDATA WHERE ID=?) WHERE ID=?");
prep.setLong(1, id);
prep.setLong(2, id);
prep.execute();
commit();
} catch (SQLException e) {
rollback();
throw convert(e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -