package com.zenquery.model.dao.impl; import com.zenquery.model.QueryVersion; import com.zenquery.model.dao.QueryVersionDAO; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; /** * Created by willy on 13.04.14. */ public class JdbcQueryVersionDAO implements QueryVersionDAO { private DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public QueryVersion find(Integer id) { String sql = "SELECT * FROM query_versions WHERE id = ?"; jdbcTemplate = new JdbcTemplate(dataSource); QueryVersion queryVersion = jdbcTemplate.query(sql, new Object[] { id }, new QueryVersionMapper()).get(0); return queryVersion; } public QueryVersion findByQueryIdAndVersion(Integer id, Integer version) { String sql = "SELECT * FROM query_versions WHERE query_id = ? AND version = ?"; jdbcTemplate = new JdbcTemplate(dataSource); QueryVersion queryVersion = jdbcTemplate.query(sql, new Object[] { id, version }, new QueryVersionMapper()).get(0); return queryVersion; } public QueryVersion findCurrentByQueryId(Integer id) { String sql = "SELECT * FROM query_versions WHERE query_id = ? AND is_current_version = TRUE"; jdbcTemplate = new JdbcTemplate(dataSource); QueryVersion queryVersion = jdbcTemplate.query(sql, new Object[] { id }, new QueryVersionMapper()).get(0); return queryVersion; } public List<QueryVersion> findByQueryId(Integer id) { String sql = "SELECT * FROM query_versions WHERE query_id = ?"; jdbcTemplate = new JdbcTemplate(dataSource); List<QueryVersion> queryVersions = jdbcTemplate.query(sql, new Object[] { id }, new QueryVersionMapper()); return queryVersions; } public List<QueryVersion> findPreviousVersionsByQueryId(Integer id) { String sql = "SELECT * FROM query_versions WHERE query_id = ? AND is_current_version = FALSE ORDER BY ID DESC"; jdbcTemplate = new JdbcTemplate(dataSource); List<QueryVersion> queryVersions = jdbcTemplate.query(sql, new Object[] { id }, new QueryVersionMapper()); return queryVersions; } public List<QueryVersion> findAll() { String sql = "SELECT * FROM query_versions"; jdbcTemplate = new JdbcTemplate(dataSource); List<QueryVersion> queryVersions = jdbcTemplate.query(sql, new QueryVersionMapper()); return queryVersions; } public Number insert(final QueryVersion queryVersion) { final String sql = "INSERT INTO query_versions (content, version, is_current_version, query_id) VALUES (?, ?, ?, ?)"; jdbcTemplate = new JdbcTemplate(dataSource); KeyHolder keyHolder = new GeneratedKeyHolder(); PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement preparedStatement = connection.prepareStatement(sql, new String[] { "id" }); preparedStatement.setString(1, queryVersion.getContent()); preparedStatement.setInt(2, queryVersion.getVersion()); preparedStatement.setBoolean(3, queryVersion.getIsCurrentVersion()); preparedStatement.setInt(4, queryVersion.getQueryId()); return preparedStatement; } }; jdbcTemplate.update( preparedStatementCreator, keyHolder ); return keyHolder.getKey(); } public void update(Integer id, QueryVersion queryVersion) { String sql = "UPDATE query_versions SET content = ?, version = ?, is_current_version = ? WHERE id = ?"; jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update( sql, new Object[] { queryVersion.getContent(), queryVersion.getVersion(), queryVersion.getIsCurrentVersion(), id } ); } public void delete(Integer id) { String sql = "DELETE FROM query_versions WHERE id = ?"; jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(sql, new Object[] { id }); } public void deleteByQueryId(Integer id) { String sql = "DELETE FROM query_versions WHERE query_id = ?"; jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(sql, new Object[] { id }); } private static class QueryVersionMapper implements RowMapper<QueryVersion> { public QueryVersion mapRow(ResultSet rs, int rowNum) throws SQLException { QueryVersion queryVersion = new QueryVersion(); queryVersion.setId(rs.getInt("id")); queryVersion.setContent(rs.getString("content")); queryVersion.setVersion(rs.getInt("version")); queryVersion.setIsCurrentVersion(rs.getBoolean("is_current_version")); queryVersion.setQueryId(rs.getInt("query_id")); return queryVersion; } } }