content: package com.alibaba.datax.plugin.writer.hologresjdbcwriter.util;
  
  import com.alibaba.datax.common.exception.DataXException;
  import com.alibaba.datax.common.util.Configuration;
  import com.alibaba.datax.plugin.rdbms.util.DBUtil;
  import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode;
  import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
  import com.alibaba.datax.plugin.rdbms.util.RdbmsException;
  import com.alibaba.datax.plugin.rdbms.writer.Constant;
  import com.alibaba.datax.plugin.rdbms.writer.Key;
  import org.apache.commons.lang3.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import java.sql.Connection;
  import java.sql.Statement;
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.List;
  
  public final class WriterUtil {
      private static final Logger LOG = LoggerFactory.getLogger(WriterUtil.class);
  
      //TODO 切分报错
      public static List<Configuration> doSplit(Configuration simplifiedConf,
                                                int adviceNumber) {
  
          List<Configuration> splitResultConfigs = new ArrayList<Configuration>();
  
          int tableNumber = simplifiedConf.getInt(Constant.TABLE_NUMBER_MARK);
  
          //处理单表的情况
          if (tableNumber == 1) {
              //由于在之前的  master prepare 中已经把 table,jdbcUrl 提取出来，所以这里处理十分简单
              for (int j = 0; j < adviceNumber; j++) {
                  splitResultConfigs.add(simplifiedConf.clone());
              }
  
              return splitResultConfigs;
          }
  
          if (tableNumber != adviceNumber) {
              throw DataXException.asDataXException(DBUtilErrorCode.CONF_ERROR,
                      String.format("您的配置文件中的列配置信息有误. 您要写入的目的端的表个数是:%s , 但是根据系统建议需要切分的份数是：%s. 请检查您的配置并作出修改.",
                              tableNumber, adviceNumber));
          }
  
          String jdbcUrl;
          List<String> preSqls = simplifiedConf.getList(Key.PRE_SQL, String.class);
          List<String> postSqls = simplifiedConf.getList(Key.POST_SQL, String.class);
  
          List<Object> conns = simplifiedConf.getList(Constant.CONN_MARK,
                  Object.class);
  
          for (Object conn : conns) {
              Configuration sliceConfig = simplifiedConf.clone();
  
              Configuration connConf = Configuration.from(conn.toString());
              jdbcUrl = connConf.getString(Key.JDBC_URL);
              sliceConfig.set(Key.JDBC_URL, jdbcUrl);
  
              sliceConfig.remove(Constant.CONN_MARK);
  
              List<String> tables = connConf.getList(Key.TABLE, String.class);
  
              for (String table : tables) {
                  Configuration tempSlice = sliceConfig.clone();
                  tempSlice.set(Key.TABLE, table);
                  tempSlice.set(Key.PRE_SQL, renderPreOrPostSqls(preSqls, table));
                  tempSlice.set(Key.POST_SQL, renderPreOrPostSqls(postSqls, table));
  
                  splitResultConfigs.add(tempSlice);
              }
  
          }
  
          return splitResultConfigs;
      }
  
      public static List<String> renderPreOrPostSqls(List<String> preOrPostSqls, String tableName) {
          if (null == preOrPostSqls) {
              return Collections.emptyList();
          }
  
          List<String> renderedSqls = new ArrayList<String>();
          for (String sql : preOrPostSqls) {
              //preSql为空时，不加入执行队列
              if (StringUtils.isNotBlank(sql)) {
                  renderedSqls.add(sql.replace(Constant.TABLE_NAME_PLACEHOLDER, tableName));
              }
          }
  
          return renderedSqls;
      }
  
      public static void executeSqls(Connection conn, List<String> sqls, String basicMessage,DataBaseType dataBaseType) {
          Statement stmt = null;
          String currentSql = null;
          try {
              stmt = conn.createStatement();
              for (String sql : sqls) {
                  currentSql = sql;
                  DBUtil.executeSqlWithoutResultSet(stmt, sql);
              }
          } catch (Exception e) {
              throw RdbmsException.asQueryException(dataBaseType,e,currentSql,null,null);
          } finally {
              DBUtil.closeDBResources(null, stmt, null);
          }
      }
  }
  