content: 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;
      }
  }
  