package jef.database.innerpool; import java.sql.Connection; import java.sql.SQLException; import java.sql.Savepoint; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import jef.database.DbUtils; import jef.tools.Assert; final class Savepoints implements Savepoint{ private final List<Entry<Connection,Savepoint>> list=new ArrayList<Entry<Connection,Savepoint>>(5); private String name; private int id=-1; /** * 构造,带ID * @param id */ public Savepoints(int id) { this.id=id; } /** * 构造,带名称 * @param name */ public Savepoints(String name) { Assert.notNull(name); this.name=name; } public void add(Connection conn,Savepoint point){ list.add(new jef.common.Entry<Connection,Savepoint>(conn,point)); } public void doRelease()throws SQLException{ List<SQLException> error=new ArrayList<SQLException>(list.size()); for(Entry<Connection,Savepoint> e:list){ try{ e.getKey().releaseSavepoint(e.getValue()); }catch(SQLException ex){ error.add(ex); } } if(!error.isEmpty()){ throw DbUtils.wrapExceptions(error); } } public void doRollback()throws SQLException{ List<SQLException> error=new ArrayList<SQLException>(list.size()); for(Entry<Connection,Savepoint> e:list){ try{ e.getKey().rollback(e.getValue()); }catch(SQLException ex){ error.add(ex); } } if(!error.isEmpty()){ throw DbUtils.wrapExceptions(error); } } @Override public int getSavepointId() throws SQLException { if(name!=null){ throw new SQLException("the savepoint has a String name."); } return id; } @Override public String getSavepointName() throws SQLException { if(name==null){ throw new SQLException("the savepoint is unnamed."); } return name; } }