From 6a3410ffa6e8c06d7f502cdbf34a7830bfe50d99 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期一, 30 十月 2023 16:10:47 +0800
Subject: [PATCH] 修改gorm log, 添加集群状态判断, 默认开启

---
 serf/sync.go |   77 ++++++++++++++++++++++++++++++++++----
 1 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/serf/sync.go b/serf/sync.go
index ce3c2fb..d8ef4c7 100644
--- a/serf/sync.go
+++ b/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 ""

--
Gitblit v1.8.0