/**
* HiveDB is an Open Source (LGPL) system for creating large, high-transaction-volume
* data storage systems.
*/
package org.hivedb.meta.persistence;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.hivedb.HiveRuntimeException;
import org.hivedb.meta.SecondaryIndex;
import org.hivedb.util.database.JdbcTypeMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreatorFactory;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
/**
* @author Justin McCarthy (jmccarthy@cafepress.com)
*/
public class SecondaryIndexDao extends JdbcDaoSupport {
public SecondaryIndexDao(DataSource ds) {
this.setDataSource(ds);
}
public Integer create(SecondaryIndex newObject) {
Object[] parameters;
parameters = new Object[] {
newObject.getResource().getId(),
newObject.getColumnInfo().getName(),
JdbcTypeMapper.jdbcTypeToString(newObject.getColumnInfo()
.getColumnType()) };
KeyHolder generatedKey = new GeneratedKeyHolder();
JdbcTemplate j = getJdbcTemplate();
PreparedStatementCreatorFactory creatorFactory = new PreparedStatementCreatorFactory(
"INSERT INTO secondary_index_metadata (resource_id,column_name,db_type) VALUES (?,?,?)",
new int[] { Types.INTEGER, Types.VARCHAR, Types.VARCHAR });
creatorFactory.setReturnGeneratedKeys(true);
int rows = j.update(creatorFactory
.newPreparedStatementCreator(parameters), generatedKey);
if (rows != 1)
throw new HiveRuntimeException("Unable to create secondary index: "
+ parameters);
if (generatedKey.getKeyList().size() == 0)
throw new HiveRuntimeException("Unable to retrieve generated primary key");
newObject.updateId(generatedKey.getKey().intValue());
return new Integer(newObject.getId());
}
public List<SecondaryIndex> loadAll() {
JdbcTemplate t = getJdbcTemplate();
ArrayList<SecondaryIndex> results = new ArrayList<SecondaryIndex>();
for (Object si : t.query("SELECT * FROM secondary_index_metadata",
new SecondaryIndexRowMapper())) {
results.add((SecondaryIndex) si);
}
return results;
}
class SecondaryIndexRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int index) throws SQLException{
int jdbcType = Types.OTHER;
jdbcType = JdbcTypeMapper.parseJdbcType(rs.getString("db_type"));
SecondaryIndex si = new SecondaryIndex(rs.getInt("id"),
rs.getString("column_name"), jdbcType);
return si;
}
}
public void update(SecondaryIndex secondaryIndex) {
Object[] parameters;
parameters = new Object[] {
secondaryIndex.getResource().getId(),
secondaryIndex.getColumnInfo().getName(),
JdbcTypeMapper.jdbcTypeToString(secondaryIndex.getColumnInfo().getColumnType()),
secondaryIndex.getId()};
KeyHolder generatedKey = new GeneratedKeyHolder();
JdbcTemplate j = getJdbcTemplate();
PreparedStatementCreatorFactory creatorFactory = new PreparedStatementCreatorFactory(
"UPDATE secondary_index_metadata SET resource_id=?,column_name=?,db_type=? WHERE id=?",
new int[] { Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.INTEGER });
creatorFactory.setReturnGeneratedKeys(true);
int rows = j.update(creatorFactory
.newPreparedStatementCreator(parameters), generatedKey);
if (rows != 1)
throw new HiveRuntimeException("Unable to update secondary index: " + secondaryIndex.getId());
}
public void delete(SecondaryIndex secondaryIndex) {
Object[] parameters;
parameters = new Object[] { secondaryIndex.getId()};
JdbcTemplate j = getJdbcTemplate();
PreparedStatementCreatorFactory creatorFactory = new PreparedStatementCreatorFactory(
"DELETE FROM secondary_index_metadata WHERE id=?",
new int[] { Types.INTEGER });
int rows = j.update(creatorFactory
.newPreparedStatementCreator(parameters));
if (rows != 1)
throw new HiveRuntimeException("Unable to delete secondary index for id: " + secondaryIndex.getId());
}
public List<SecondaryIndex> findByResource(int id) {
JdbcTemplate t = getJdbcTemplate();
ArrayList<SecondaryIndex> results = new ArrayList<SecondaryIndex>();
for (Object si : t.query("SELECT * FROM secondary_index_metadata WHERE resource_id = ?",
new Object[] { id },
new SecondaryIndexRowMapper())) {
results.add((SecondaryIndex) si);
}
return results;
}
}