package ee.esutoniagodesu.repository.project; import ee.esutoniagodesu.domain.SHAFile; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCallback; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.*; import java.time.ZoneId; import java.time.ZonedDateTime; public class SHADBRepository extends AbstractRepository { public SHADBRepository(JdbcTemplate jdbcShadb) { super(jdbcShadb); } public SHAFile findBySha256sum(String sha256sum) { String sql = "select sha256sum, length, mime, file_name, file_extension," + " created_by, created_date, last_modified_by, last_modified_date, file" + " from sha_file where sha256sum = ?"; CustomPreparedStatementCreator sc = new CustomPreparedStatementCreator(sql) { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement s = con.prepareStatement(this.sql); setString(s, 1, sha256sum); return s; } }; PreparedStatementCallback<SHAFile> cb = s -> { ResultSet rs = s.executeQuery(); SHAFile result = new SHAFile(); while (rs.next()) { int i = 1; result.setSha256sum(rs.getString(i++)); result.setLength(rs.getLong(i++)); result.setMime(rs.getString(i++)); result.setFileName(rs.getString(i++)); result.setFileExtension(rs.getString(i++)); result.setCreatedBy(rs.getString(i++)); result.setCreatedDate(ZonedDateTime.of(rs.getTimestamp(i++).toLocalDateTime(), ZoneId.systemDefault())); result.setLastModifiedBy(rs.getString(i++)); Timestamp ts = rs.getTimestamp(i++); if (!rs.wasNull()) { result.setLastModifiedDate(ZonedDateTime.of(ts.toLocalDateTime(), ZoneId.systemDefault())); } try { Path path = Paths.get(result.getSha256sum()); Files.copy(rs.getBinaryStream(i), path); File file = path.toFile(); result.setFile(file); } catch (IOException e) { throw new RuntimeException(e); } } return result; }; return execute(sc, cb); } public void save(SHAFile shafile) { String sql = "insert into public.sha_file(file, sha256sum, length, mime, file_name, file_extension," + " created_by, created_date, last_modified_by, last_modified_date)" + " values(FILE_READ(?),?,?,?,?, ?,?,?,?,?)"; CustomPreparedStatementCreator sc = new CustomPreparedStatementCreator(sql) { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement s = con.prepareStatement(this.sql); int i = 1; setString(s, i++, shafile.getFile().getAbsolutePath()); setString(s, i++, shafile.getSha256sum()); setLong(s, i++, shafile.getLength()); setString(s, i++, shafile.getMime()); setString(s, i++, shafile.getFileName()); setString(s, i++, shafile.getFileExtension()); setString(s, i++, shafile.getCreatedBy()); setTimestamp(s, i++, Timestamp.from(shafile.getCreatedDate().toInstant())); setString(s, i++, shafile.getLastModifiedBy()); setTimestamp(s, i, shafile.getLastModifiedDate() != null ? Timestamp.from(shafile.getLastModifiedDate().toInstant()) : null); return s; } }; PreparedStatementCallback cb = PreparedStatement::execute; execute(sc, cb); } }