package org.jboss.ejb.plugins.cmp.jdbc.keygen;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.lang.reflect.Method;
import javax.ejb.EJBException;
import org.jboss.ejb.plugins.cmp.jdbc.JDBCIdentityColumnCreateCommand;
import org.jboss.ejb.plugins.cmp.jdbc.WrappedStatement;
import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCEntityCommandMetaData;
import org.jboss.ejb.EntityEnterpriseContext;
import org.jboss.deployment.DeploymentException;
public class JDBCInformixCreateCommand extends JDBCIdentityColumnCreateCommand
{
private static final String NAME = "class-name";
private static final String DEFAULT_CLASS = "com.informix.jdbc.IfxStatement";
private static final String METHOD = "method";
private static final String DEFAULT_METHOD = "getSerial";
private String className;
private String methodName;
private Method method;
public void init(JDBCStoreManager manager) throws DeploymentException
{
super.init(manager);
try
{
Class psClass = GetTCLAction.getContextClassLoader().loadClass(className);
method = psClass.getMethod(methodName, null);
}
catch(ClassNotFoundException e)
{
throw new DeploymentException("Could not load driver class: " + className, e);
}
catch(NoSuchMethodException e)
{
throw new DeploymentException("Driver does not have method: " + methodName + "()");
}
}
protected void initEntityCommand(JDBCEntityCommandMetaData entityCommand) throws DeploymentException
{
super.initEntityCommand(entityCommand);
className = entityCommand.getAttribute(NAME);
if(className == null)
{
className = DEFAULT_CLASS;
}
methodName = entityCommand.getAttribute(METHOD);
if(methodName == null)
{
methodName = DEFAULT_METHOD;
}
}
protected int executeInsert(int paramIndex, PreparedStatement ps, EntityEnterpriseContext ctx) throws SQLException
{
int rows = ps.executeUpdate();
while(ps instanceof WrappedStatement)
{
ps = (PreparedStatement)((WrappedStatement)ps).getUnderlyingStatement();
}
try
{
Number pk = (Number)method.invoke(ps, null);
pkField.setInstanceValue(ctx, pk);
return rows;
}
catch(RuntimeException e)
{
throw e;
}
catch(Exception e)
{
throw new EJBException("Error extracting generated keys", e);
}
}
}