package jef.orm.custom;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map;
import jef.database.dialect.DatabaseDialect;
import jef.database.dialect.type.AColumnMapping;
import jef.database.jdbc.result.IResultSet;
import org.hsqldb.types.Types;
public class HstoreMapMapping extends AColumnMapping {
@Override
public Object jdbcSet(PreparedStatement st, Object value, int index, DatabaseDialect dialect) throws SQLException {
if (value == null) {
st.setNull(index, Types.OTHER);
} else {
Map<String, String> map = (Map<String, String>) value;
st.setObject(index, map);
}
return value;
}
private String toString(Map<String, String> map) {
StringBuilder sb = new StringBuilder(map.size() * 10);
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
if (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
sb.append(entry.getKey()).append("=>").append(entry.getValue());
}
for (; iter.hasNext();) {
Map.Entry<String, String> entry = iter.next();
sb.append(',').append(entry.getKey()).append("=>").append(entry.getValue());
}
return sb.toString();
}
@Override
public int getSqlType() {
return Types.OTHER;
}
@Override
public Object jdbcGet(IResultSet rs, int n) throws SQLException {
Map o = (Map)rs.getObject(n);
return o;
}
@Override
protected String getSqlExpression(Object value, DatabaseDialect profile) {
Map<String, String> map = (Map<String, String>) value;
return this.wrapSqlStr(toString(map));
}
// PreparedStatement ps = c.prepareStatement(
// "insert into xyz(id, data) values(?, hstore(?, ?))");
//
// ps.setLong(1, 23456L);
// ps.setArray(2, c.createArrayOf("text", new String[]{"name", "city"}));
// ps.setArray(3, c.createArrayOf("text", new String[]{"Duke", "Valley"}));
@Override
protected Class<?> getDefaultJavaType() {
return Map.class;
}
}