package org.springblade.binlog.vo;
|
|
|
import com.github.shyiko.mysql.binlog.event.EventType;
|
import com.google.common.collect.Maps;
|
import lombok.Data;
|
|
import java.io.Serializable;
|
import java.util.Map;
|
|
import static com.github.shyiko.mysql.binlog.event.EventType.isDelete;
|
import static com.github.shyiko.mysql.binlog.event.EventType.isWrite;
|
|
/**
|
* binlog对象
|
*
|
* @author zrj
|
* @since 2024/02/19
|
**/
|
@Data
|
public class BinLogItem implements Serializable {
|
private static final long serialVersionUID = 5503152746318421290L;
|
|
private String dbTable;
|
private EventType eventType;
|
private Long timestamp = null;
|
private Long serverId = null;
|
// 存储字段-之前的值之后的值
|
private Map<String, Serializable> before = null;
|
private Map<String, Serializable> after = null;
|
// 存储字段--类型
|
private Map<String, DataProperty> dataProperty = null;
|
|
/**
|
* 新增或者删除操作数据格式化
|
*/
|
public static BinLogItem itemFromInsertOrDeleted(Serializable[] row, Map<String, DataProperty> dataPropertyMap, EventType eventType) {
|
if (null == row || null == dataPropertyMap) {
|
return null;
|
}
|
if (row.length != dataPropertyMap.size()) {
|
return null;
|
}
|
// 初始化Item
|
BinLogItem item = new BinLogItem();
|
item.eventType = eventType;
|
item.dataProperty = dataPropertyMap;
|
item.before = Maps.newHashMap();
|
item.after = Maps.newHashMap();
|
|
Map<String, Serializable> beOrAf = Maps.newHashMap();
|
|
dataPropertyMap.entrySet().forEach(entry -> {
|
String key = entry.getKey();
|
DataProperty dataProperty = entry.getValue();
|
beOrAf.put(key, row[dataProperty.inx]);
|
});
|
|
// 写操作放after,删操作放before
|
if (isWrite(eventType)) {
|
item.after = beOrAf;
|
}
|
if (isDelete(eventType)) {
|
item.before = beOrAf;
|
}
|
|
return item;
|
}
|
|
/**
|
* 更新操作数据格式化
|
*/
|
public static BinLogItem itemFromUpdate(Map.Entry<Serializable[], Serializable[]> mapEntry, Map<String, DataProperty> dataPropertyMap, EventType eventType) {
|
if (null == mapEntry || null == dataPropertyMap) {
|
return null;
|
}
|
// 初始化Item
|
BinLogItem item = new BinLogItem();
|
item.eventType = eventType;
|
item.dataProperty = dataPropertyMap;
|
item.before = Maps.newHashMap();
|
item.after = Maps.newHashMap();
|
|
Map<String, Serializable> be = Maps.newHashMap();
|
Map<String, Serializable> af = Maps.newHashMap();
|
|
dataPropertyMap.entrySet().forEach(entry -> {
|
String key = entry.getKey();
|
DataProperty dataProperty = entry.getValue();
|
be.put(key, mapEntry.getKey()[dataProperty.inx]);
|
|
af.put(key, mapEntry.getValue()[dataProperty.inx]);
|
});
|
|
item.before = be;
|
item.after = af;
|
return item;
|
}
|
|
}
|