linwe
2024-08-09 8b7258c9427882bb1798f1502eaa35184c6e374e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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;
    }
 
}