| | |
| | | "fmt" |
| | | "os" |
| | | "os/signal" |
| | | "regexp" |
| | | "strings" |
| | | "syscall" |
| | | "time" |
| | |
| | | agent.queryTableTopic = procName + "/serf/query/sqls" |
| | | |
| | | // 设置日志回调 |
| | | db.SetLogger(&DbLogger{}) |
| | | db.SetLogger(&agent) |
| | | |
| | | // 先关闭日志 |
| | | db.LogMode(false) |
| | | //db.LogMode(false) |
| | | |
| | | return &agent |
| | | } |
| | |
| | | ss.QueryClusterStat() |
| | | |
| | | //if ss.ClusterStatus != "" { |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | //} |
| | | |
| | | initChan <- true |
| | |
| | | // 创建集群, 开启日志跟踪, 设置角色master |
| | | ss.clusterEventFn(EventCreateCluster) |
| | | ss.ClusterStatus = "master" |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | |
| | | case "join": |
| | | // 加入集群, 开启日志跟踪, 设置角色slave |
| | | ss.clusterEventFn(EventJoinCluster) |
| | | ss.onJoinCluster() |
| | | ss.ClusterStatus = "slave" |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | |
| | | case "leave": |
| | | // 退出集群, 开启日志跟踪, 设置角色slave |
| | | ss.clusterEventFn(EventLeaveCluster) |
| | | ss.ClusterStatus = "" |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | case "slave2master": |
| | | ss.clusterEventFn(EventSlave2Master) |
| | | ss.ClusterStatus = "master" |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | case "master2slave": |
| | | ss.clusterEventFn(EventMaster2Slave) |
| | | ss.ClusterStatus = "slave" |
| | | ss.sqlDB.LogMode(true) |
| | | //ss.sqlDB.LogMode(true) |
| | | } |
| | | } |
| | | } |
| | |
| | | return err |
| | | } |
| | | |
| | | func (ss *SyncServer)Print(values ...interface{}) { |
| | | var ( |
| | | level = values[0] |
| | | ) |
| | | |
| | | //fmt.Println("dblogger", values) |
| | | |
| | | if level == "sql" { |
| | | msgArr := gorm.LogFormatter(values...) |
| | | sql := msgArr[3].(string) |
| | | logx.Infof("sql: %v", sql) |
| | | sql = strings.TrimPrefix(sql, " ") |
| | | if !strings.HasPrefix(sql, "SELECT") && !strings.HasPrefix(sql, "select") && !strings.Contains(sql, "PRAGMA") && !strings.Contains(sql, "pragma") { |
| | | affected := values[5].(int64) |
| | | if affected > 0 { //执行成功 |
| | | //判断操作的是哪张表 |
| | | whereIdx := strings.Index(sql, "WHERE") |
| | | sqlWithTable := sql |
| | | if whereIdx > -1 { |
| | | sqlWithTable = sql[:whereIdx] |
| | | } |
| | | |
| | | //fmt.Println("判断是哪张表 sqlWithTable:", sqlWithTable) |
| | | |
| | | insertReg := regexp.MustCompile(`^\s*(?i:insert)\s`) //insert |
| | | updateReg := regexp.MustCompile(`^\s*(?i:update)\s`) //update |
| | | delReg := regexp.MustCompile(`^\s*(?i:delete)\s`) //delete |
| | | |
| | | if insertReg.MatchString(sqlWithTable) { |
| | | //fmt.Println("插入操作") |
| | | for _, t := range agent.syncTables { |
| | | reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`) |
| | | if reg.MatchString(sqlWithTable) { |
| | | //fmt.Println("属于同步表:", t) |
| | | // 判断是在集群内, 同步消息, 判断两种角色, 为避免其他出现状态 |
| | | if ss.ClusterStatus == "master" || ss.ClusterStatus == "slave" { |
| | | syncSqlChan <- sql |
| | | } |
| | | } |
| | | } |
| | | } else if updateReg.MatchString(sqlWithTable) || delReg.MatchString(sqlWithTable) { |
| | | //fmt.Println("删除或者更新") |
| | | for _, t := range agent.syncTables { |
| | | reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`) |
| | | if reg.MatchString(sqlWithTable) { |
| | | //fmt.Println("属于同步表:", t) |
| | | if ss.ClusterStatus == "master" || ss.ClusterStatus == "slave" { |
| | | syncSqlChan <- sql |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } else { |
| | | fmt.Println("dbLogger level!=sql") |
| | | } |
| | | } |
| | | |
| | | func arrayContains(list []string, arr []string) string { |
| | | if arr == nil || list == nil { |
| | | return "" |