package com.alibaba.datax.plugin.rdbms.reader.util; import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.rdbms.reader.Key; import com.alibaba.datax.plugin.rdbms.util.DBUtil; import com.alibaba.datax.plugin.rdbms.util.DataBaseType; import com.alibaba.datax.plugin.rdbms.util.RdbmsException; import com.alibaba.druid.sql.parser.ParserException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.Connection; import java.sql.ResultSet; import java.util.List; import java.util.concurrent.Callable; /** * Created by judy.lt on 2015/6/4. */ public class PreCheckTask implements Callable<Boolean>{ private static final Logger LOG = LoggerFactory.getLogger(PreCheckTask.class); private String userName; private String password; private String splitPkId; private Configuration connection; private DataBaseType dataBaseType; public PreCheckTask(String userName, String password, Configuration connection, DataBaseType dataBaseType, String splitPkId){ this.connection = connection; this.userName=userName; this.password=password; this.dataBaseType = dataBaseType; this.splitPkId = splitPkId; } @Override public Boolean call() throws DataXException { String jdbcUrl = this.connection.getString(Key.JDBC_URL); List<Object> querySqls = this.connection.getList(Key.QUERY_SQL, Object.class); List<Object> splitPkSqls = this.connection.getList(Key.SPLIT_PK_SQL, Object.class); List<Object> tables = this.connection.getList(Key.TABLE,Object.class); Connection conn = DBUtil.getConnectionWithoutRetry(this.dataBaseType, jdbcUrl, this.userName, password); int fetchSize = 1; if(DataBaseType.MySql.equals(dataBaseType) || DataBaseType.DRDS.equals(dataBaseType)) { fetchSize = Integer.MIN_VALUE; } try{ for (int i=0;i<querySqls.size();i++) { String splitPkSql = null; String querySql = querySqls.get(i).toString(); String table = null; if (tables != null && !tables.isEmpty()) { table = tables.get(i).toString(); } /*verify query*/ ResultSet rs = null; try { DBUtil.sqlValid(querySql,dataBaseType); if(i == 0) { rs = DBUtil.query(conn, querySql, fetchSize); } } catch (ParserException e) { throw RdbmsException.asSqlParserException(this.dataBaseType, e, querySql); } catch (Exception e) { throw RdbmsException.asQueryException(this.dataBaseType, e, querySql, table, userName); } finally { DBUtil.closeDBResources(rs, null, null); } /*verify splitPK*/ try{ if (splitPkSqls != null && !splitPkSqls.isEmpty()) { splitPkSql = splitPkSqls.get(i).toString(); DBUtil.sqlValid(splitPkSql,dataBaseType); if(i == 0) { SingleTableSplitUtil.precheckSplitPk(conn, splitPkSql, fetchSize, table, userName); } } } catch (ParserException e) { throw RdbmsException.asSqlParserException(this.dataBaseType, e, splitPkSql); } catch (DataXException e) { throw e; } catch (Exception e) { throw RdbmsException.asSplitPKException(this.dataBaseType, e, splitPkSql,this.splitPkId.trim()); } } } finally { DBUtil.closeDBResources(null, conn); } return true; } }