/* * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program (see the file COPYING.LIB for more * details); if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.dcache.chimera; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DirectoryStreamImpl { private static final String QUERY = "SELECT i.*, d.iname FROM t_inodes i JOIN t_dirs d ON i.inumber = d.ichild WHERE d.iparent=? " + "UNION ALL " + "SELECT i.*, '.' FROM t_inodes i WHERE i.inumber=? " + "UNION ALL " + "SELECT i.*, '..' FROM t_inodes i JOIN t_dirs d ON i.inumber = d.iparent WHERE d.ichild=?"; private final ResultSet _resultSet; private final JdbcTemplate _jdbc; private final Connection _connection; private final PreparedStatement _statement; DirectoryStreamImpl(FsInode dir, JdbcTemplate jdbc) { _jdbc = jdbc; Connection connection = null; PreparedStatement ps = null; ResultSet rs; try { connection = DataSourceUtils.getConnection(_jdbc.getDataSource()); ps = connection.prepareStatement(QUERY); ps.setFetchSize(50); ps.setLong(1, dir.ino()); ps.setLong(2, dir.ino()); ps.setLong(3, dir.ino()); rs = ps.executeQuery(); } catch (SQLException ex) { JdbcUtils.closeStatement(ps); DataSourceUtils.releaseConnection(connection, _jdbc.getDataSource()); throw _jdbc.getExceptionTranslator().translate("StatementExecution", QUERY, ex); } _connection = connection; _resultSet = rs; _statement = ps; } public void close() throws IOException { try { JdbcUtils.closeResultSet(_resultSet); JdbcUtils.closeStatement(_statement); DataSourceUtils.releaseConnection(_connection, _jdbc.getDataSource()); } catch (DataAccessException e) { throw new IOException(e.getMessage(), e); } } public ResultSet next() throws SQLException { return _resultSet.next() ? _resultSet : null; } }