zhangzengfei
2023-10-30 6a3410ffa6e8c06d7f502cdbf34a7830bfe50d99
serf/sync.go
@@ -7,6 +7,7 @@
   "fmt"
   "os"
   "os/signal"
   "regexp"
   "strings"
   "syscall"
   "time"
@@ -65,9 +66,10 @@
   agent.queryTableTopic = procName + "/serf/query/sqls"
   // 设置日志回调
   db.SetLogger(&DbLogger{})
   db.SetLogger(&agent)
   // 先关闭日志
   db.LogMode(false)
   //db.LogMode(false)
   return &agent
}
@@ -153,7 +155,7 @@
   ss.QueryClusterStat()
   //if ss.ClusterStatus != "" {
   ss.sqlDB.LogMode(true)
   //ss.sqlDB.LogMode(true)
   //}
   initChan <- true
@@ -239,28 +241,28 @@
                  // 创建集群, 开启日志跟踪, 设置角色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)
               }
            }
         }
@@ -437,6 +439,65 @@
   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 ""