package org.nutz.dao.impl.entity.macro;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.MappingField;
import org.nutz.dao.impl.jdbc.NutPojo;
import org.nutz.dao.jdbc.ValueAdaptor;
import org.nutz.dao.sql.Pojo;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlType;
import org.nutz.lang.Lang;
public class SqlFieldMacro extends NutPojo {
private Sql sql;
private MappingField entityField;
private SqlFieldMacro() {
super();
}
public SqlFieldMacro(MappingField field, String str) {
super();
this.entityField = field;
this.sql = Sqls.create(str);
this.setSqlType(this.sql.getSqlType());
this.setEntity(field.getEntity());
}
@Override
public Pojo setOperatingObject(Object obj) {
super.setOperatingObject(obj);
if (null != obj) {
Entity<?> en = entityField.getEntity();
if (!en.getType().isInstance(obj))
throw Lang.makeThrow( "Invalid operating object '%s' for field '%s'",
obj.getClass().getName(),
entityField.toString());
// 填充占位符 ...
for (String name : sql.varIndex().names())
if (!name.equals("table") && !name.equals("view") && !name.equals("field"))
sql.vars().set(name, en.getField(name).getValue(obj));
// 填充变量 ...
for (String name : sql.paramIndex().names())
sql.params().set(name, en.getField(name).getValue(obj));
}
return this;
}
public void onAfter(Connection conn, ResultSet rs) throws SQLException {
if (rs.next()) {
String colName = rs.getMetaData().getColumnName(1);
Object obj = entityField.getAdaptor().get(rs, colName);
entityField.setValue(this.getOperatingObject(), obj);
}
}
public SqlType getSqlType() {
return sql.getSqlType();
}
public ValueAdaptor[] getAdaptors() {
return sql.getAdaptors();
}
public Object[][] getParamMatrix() {
return sql.getParamMatrix();
}
public String toPreparedStatement() {
return _parseSQL(sql.duplicate()).toPreparedStatement();
}
@Override
public Pojo duplicate() {
SqlFieldMacro re = new SqlFieldMacro();
re.sql = sql.duplicate();
re.entityField = entityField;
re.setSqlType(sql.getSqlType());
re.setEntity(entityField.getEntity());
return re;
}
private Sql _parseSQL(Sql sql) {
for (String name : sql.varIndex().names()) {
if ("view".equals(name))
sql.vars().set("view", getEntity().getViewName());
else if ("table".equals(name))
sql.vars().set("table", getEntity().getTableName());
else if ("field".equals(name))
sql.vars().set("field", entityField.getColumnName());
else
sql.vars().set(name, getEntity().getField(name).getValue(getOperatingObject()));
}
for (String name : sql.paramIndex().names()) {
sql.params().set(name, getEntity().getField(name).getValue(getOperatingObject()));
}
return sql;
}
}