Пример #1
0
 private String[] getInsertUpdateSql(
     ColumnTypeHelper helper, WriteRowsEvent event, RDBSchnauzer rep)
     throws UnsupportedEncodingException {
   List<Row> rows = event.getRows();
   BitColumn bCol = event.getUsedColumns().clone();
   String InsertSql = rep.getInsertFields(bCol);
   String[] sql = new String[rows.size()];
   rep.setUsedColumn(bCol);
   byte[] unsigntags = rep.getUnsignedTags();
   String rowSql = "";
   if (Tags.Verbose) LOGGER.info(rows.size() + Infos.Row);
   int index = 0;
   String cuid = "";
   for (int j = 0; j < rows.size(); j++) {
     rowSql = "";
     Row row = rows.get(j);
     List<Column> columns = row.getColumns();
     if (!rep.needReplicate(columns)) continue;
     cuid = getCuid(rep);
     rowSql =
         InsertSql
             + "("
             + helper.getValueStr(columns, bCol, unsigntags, rep.getFullFields())
             + rep.getDefStr()
             + cuid
             + ")";
     rowSql +=
         "  ON duplicate KEY UPDATE "
             + helper.getUpdataStr(columns, rep.getColumnNames(), unsigntags, rep.getFullFields());
     sql[index++] = rowSql;
   }
   return sql;
 }
Пример #2
0
 private String[] getInsUpSqlSql(ColumnTypeHelper helper, WriteRowsEvent event, RDBSchnauzer rep)
     throws UnsupportedEncodingException {
   List<Row> rows = event.getRows();
   BitColumn bCol = event.getUsedColumns().clone();
   String InsertSql = rep.getInsertFields(bCol);
   String sIfExistPre =
       " set nocount off  if not exists(select 1 from " + rep.getSlaveTableName() + " where ";
   String updatePre = "   UPDATE " + rep.getSlaveTableName() + " SET ";
   String[] sql = new String[rows.size() * 4];
   rep.setUsedColumn(bCol);
   byte[] unsigntags = rep.getUnsignedTags();
   String rowSql = "";
   if (Tags.Verbose) LOGGER.info(rows.size() + Infos.Row);
   int index = 0;
   for (int j = 0; j < rows.size(); j++) {
     rowSql = "";
     Row row = rows.get(j);
     List<Column> columns = row.getColumns();
     if (!rep.needReplicate(columns)) continue;
     rowSql = sIfExistPre + getWhereStr(rep, columns, helper) + ")  ";
     String cuid = getCuid(rep);
     rowSql +=
         InsertSql
             + "("
             + helper.getValueStr(columns, bCol, unsigntags, rep.getFullFields())
             + rep.getDefStr()
             + cuid
             + ")";
     rowSql += " else ";
     rowSql +=
         updatePre
             + helper.getUpdataStr(columns, rep.getColumnNames(), unsigntags, rep.getFullFields())
             + " where "
             + getWhereStr(rep, columns, helper)
             + "   ";
     sql[index++] = rowSql;
   }
   return sql;
 }
Пример #3
0
  @Override
  public boolean doUpdate(ColumnTypeHelper helper, UpdateRowsEvent event) {
    String preSql = "";
    String aftSql = "";
    boolean doOne = false;
    String[] sqls = null;
    int sqlsIndex = 0;
    doBeforeUpdate(helper, event);
    for (int i = 0; i < tables.size(); i++) {
      RDBSchnauzer rep = (RDBSchnauzer) tables.get(i);
      if (notEqualS(helper.databaseName, this.masterDb.dbname)) continue;
      if (notEqualS(helper.tableName, rep.getMasterTableName())) continue;
      List<Pair<Row>> rows = event.getRows();
      String[] tableSqls = new String[rows.size() + 1];
      int pos = 1;
      byte[] unsigntags = rep.getUnsignedTags();
      for (int j = 0; j < rows.size(); j++) {
        String sql = "Update " + rep.getSlaveTableName() + "  set ";
        Pair<Row> pRow = rows.get(j);
        Row row = pRow.getAfter();
        Row preRow = pRow.getBefore();

        List<Column> columns = row.getColumns();
        List<Column> pcolumns = preRow.getColumns();
        if (!rep.needReplicate(columns)) continue;
        try {
          preSql =
              helper.getUpdataStr(pcolumns, rep.getColumnNames(), unsigntags, rep.getFullFields());
          aftSql =
              helper.getUpdataStr(columns, rep.getColumnNames(), unsigntags, rep.getFullFields());
        } catch (Exception e) {
          mailAndLog(Infos.Create + Infos.DoUpdate + Infos.Failed, e.getMessage());
          return false;
        }

        if (isEqualS(preSql, aftSql)) continue;
        sql += aftSql;
        try {
          sql += " where " + getWhereStr(rep, columns, helper);
        } catch (Exception e) {
          mailAndLog(Infos.Create + Infos.DoUpdate + Infos.Failed, e.getMessage());
          return false;
        }

        tableSqls[pos++] = sql;
        doOne = true;
      }
      if (sqls == null) {
        sqls = new String[tables.size() * rows.size() + 1];
        for (int k = 0; k < sqls.length; k++) sqls[k] = "";
        sqls[0] = getStatusUpdateSql(helper);
      }
      int sIndex = 0;
      for (int j = 0; j < tableSqls.length; j++) {
        sIndex = (sqlsIndex + 1);
        if ((tableSqls[j] == null) || (tableSqls[j].isEmpty())) continue;
        if ((sqls[sIndex] != null) && (!sqls[sIndex].isEmpty())) sqls[i + 1] += ";";
        sqls[++sqlsIndex] += tableSqls[j];
      }
    }

    String[] errInfo = new String[1];

    if (!doOne || !logSql(sqls)) {
      autoSetPosition(helper);
      return true;
    }

    if (dbhelper.excuteSqlByTransaction(sqls, errInfo)) {
      this.slaveDb.binlog = this.getBinLogName(helper);
      this.slaveDb.pos = helper.position;
      this.slaveDb.tablepos = helper.tableMapPos;
      LOGGER.info(Infos.DoUpdate + Infos.OK);
      return true;
    }

    String sInfo = getWarning(sqls, errInfo);
    mailAndLog(Infos.DoUpdate + Infos.Failed, sInfo);
    this.slaveDb.errorMsg = "Update command faild";
    HeartBeatInfo hinfo = new HeartBeatInfo();
    ConfigGetHelper conf = new ConfigGetHelper(Integer.toString(this.slaveDb.masterID));
    conf.getHeartBeatSet(hinfo);
    if (hinfo.port > 0 && !hinfo.host.isEmpty()) {
      LOGGER.info(Infos.SendErrorInfo);
      LocalInfo info = LocalInfoGetter.getLocalInfo();
      hinfo.SerialNo = info.getSNStr();
      HeartBeatSender beatSender = new HeartBeatSender(this.masterDb, this.slaveDb, hinfo);
      beatSender.sendError();
    }
    rollBackToTableEvent(helper);
    return false;
  }