/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.db; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ralasafe.util.DBUtil; public class ComplexTableDBHelper { private ComplexTable complexTable; private Connection mainTableConn=null; private Connection[] singleValueTableConns=null; private Connection[] multiValueTableConns=null; private boolean mainTableOrignalCommitMode=true; private boolean[] singleValueTableOrignalCommitModes=null; private boolean[] multiValueTableOrignalCommitModes=null; private static Log logger=LogFactory.getLog( ComplexTableDBHelper.class ); public ComplexTable getComplexTable() { return complexTable; } public void setComplexTable( ComplexTable complexTable ) { this.complexTable=complexTable; } public Connection getMainTableConn() { return mainTableConn; } public void setMainTableConn( Connection mainTableConn ) { this.mainTableConn=mainTableConn; } public Connection[] getSingleValueTableConns() { return singleValueTableConns; } public void setSingleValueTableConns( Connection[] singleValueTableConns ) { this.singleValueTableConns=singleValueTableConns; } public Connection[] getMultiValueTableConns() { return multiValueTableConns; } public void setMultiValueTableConns( Connection[] multiValueTableConns ) { this.multiValueTableConns=multiValueTableConns; } public void getConnections() { int singleValueTableSize=0; int multiValueTableSize=0; Table[] singleValueTables=complexTable.getSingleValueTables(); Table[] multiValueTables=complexTable.getMultiValueTables(); if( singleValueTables!=null ) { singleValueTableSize=singleValueTables.length; } if( multiValueTables!=null ) { multiValueTableSize=multiValueTables.length; } int[] tableIds=new int[1+singleValueTableSize+multiValueTableSize]; tableIds[0]=complexTable.getMainTable().getId(); for( int i=0; i<singleValueTableSize; i++ ) { tableIds[i+1]=singleValueTables[i].getId(); } for( int i=0; i<multiValueTableSize; i++ ) { tableIds[i+1+singleValueTableSize]=multiValueTables[i].getId(); } Connection[] conns=DBPower.getConnections( tableIds ); mainTableConn=conns[0]; if( singleValueTableSize>0 ) { singleValueTableConns=new Connection[singleValueTableSize]; for( int i=0; i<singleValueTableSize; i++ ) { singleValueTableConns[i]=conns[i+1]; } } if( multiValueTableSize>0 ) { multiValueTableConns=new Connection[multiValueTableSize]; for( int i=0; i<multiValueTableSize; i++ ) { multiValueTableConns[i]=conns[i+1+singleValueTableSize]; } } } public void beginTransaction() throws SQLException { turnAutoCommitOff(); } public void commit() throws SQLException { mainTableConn.commit(); commit( singleValueTableConns ); commit( multiValueTableConns ); } public void rollback() throws SQLException { if( mainTableConn!=null ) { mainTableConn.rollback(); } rollback( singleValueTableConns ); rollback( multiValueTableConns ); } public void closeConnections() { resetAutoCommitModes(); DBUtil.close( mainTableConn ); close( singleValueTableConns ); close( multiValueTableConns ); } private void close( Connection[] conns ) { if( conns!=null ) { for( int i=0; i<conns.length; i++ ) { DBUtil.close( conns[i] ); } } } private void rollback( Connection[] conns ) throws SQLException { if( conns!=null ) { for( int i=0; i<conns.length; i++ ) { if( conns[i]!=null ) { conns[i].rollback(); } } } } private void commit( Connection[] conns ) throws SQLException { if( conns!=null ) { for( int i=0; i<conns.length; i++ ) { if( conns[i]!=null ) { conns[i].commit(); } } } } private void turnAutoCommitOff() throws SQLException { recordAutoCmmitModes(); if( mainTableOrignalCommitMode ) { mainTableConn.setAutoCommit( false ); } turnAutoCommitOff( singleValueTableConns, singleValueTableOrignalCommitModes ); turnAutoCommitOff( multiValueTableConns, multiValueTableOrignalCommitModes ); } private void turnAutoCommitOff( Connection[] conns, boolean[] modes ) throws SQLException { if( conns!=null ) { for( int i=0; i<conns.length; i++ ) { if( modes[i] ) { conns[i].setAutoCommit( false ); } } } } /** * Record connection's mode of MainTable's, SingleValueTables' and MultiValueTables'. * * @throws SQLException */ private void recordAutoCmmitModes() throws SQLException { mainTableOrignalCommitMode=mainTableConn.getAutoCommit(); singleValueTableOrignalCommitModes=getOrignalCommitModes( singleValueTableConns ); multiValueTableOrignalCommitModes=getOrignalCommitModes( multiValueTableConns ); } private boolean[] getOrignalCommitModes( Connection[] conns ) throws SQLException { if( conns==null ) return null; boolean[] modes=new boolean[conns.length]; for( int i=0; i<conns.length; i++ ) { modes[i]=conns[i].getAutoCommit(); } return modes; } private void resetAutoCommitModes() { if( mainTableConn!=null&&mainTableOrignalCommitMode ) { try { mainTableConn.setAutoCommit( mainTableOrignalCommitMode ); } catch( SQLException e ) { logger.error( "", e ); } } resetCommitModes( singleValueTableConns, singleValueTableOrignalCommitModes ); resetCommitModes( multiValueTableConns, multiValueTableOrignalCommitModes ); } private void resetCommitModes( Connection[] conns, boolean[] modes ) { if( conns!=null ) { for( int i=0; i<conns.length; i++ ) { if( modes[i] ) { try { conns[i].setAutoCommit( modes[i] ); } catch( SQLException e ) { logger.error( "", e ); } } } } } }