zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/serf/dbLogger.go
@@ -1,143 +1,143 @@
package serf
import (
   "basic.com/valib/logger.git"
   "basic.com/valib/serf.git/serf"
   "github.com/jinzhu/gorm"
   "regexp"
   "strings"
   "time"
)
type DbLogger struct {
}
var SyncTables = []string{
   //"area",
   //"camera_area",
   //"cameras",
   //"gb28181_config",
   //"dbtablepersons",
   //"dbtables",
   "cluster",
   "cluster_node",
   "dictionary",
   "auth_config", //设备管理授权配置
   "t_device",     //设备信息表
   "t_device_app", //设备安装的app
   "t_device_sdk", //设备安装的sdk
}
func (dbLogger *DbLogger) Print(values ...interface{}) {
   var (
      level = values[0]
   )
   if level == "sql" {
      msgArr := gorm.LogFormatter(values...)
      sql := msgArr[3].(string)
      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]
            }
            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) {
               //logger.Debug("insertRegex match,sql:",sql)
               for _, t := range SyncTables {
                  reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                  if reg.MatchString(sqlWithTable) {
                     syncSqlChan <- sql
                     //if len(sql) > 100 {
                     //   logger.Debug("AgentSync insert matchedTable:",t,",len(Sql):",len(sql))
                     //} else {
                     //   logger.Debug("AgentSync insert matchedTable:",t,",Sql:",sql)
                     //}
                  }
               }
            } else if updateReg.MatchString(sqlWithTable) || delReg.MatchString(sqlWithTable) {
               //logger.Debug("update or delete Regex match,sql:",sql)
               for _, t := range SyncTables {
                  reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                  if reg.MatchString(sqlWithTable) {
                     syncSqlChan <- sql
                     //if len(sql) > 100 {
                     //   logger.Debug("AgentSync update or delete matchedTable:",t,",len(Sql):",len(sql))
                     //} else {
                     //   logger.Debug("AgentSync update or delete matchedTable:",t,",Sql:",sql)
                     //}
                  }
               }
            }
         } else {
            //if len(values) >100 {
            //   logger.Debug("exec affected=0,dbLogger len(values):",len(values))
            //} else {
            //   logger.Debug("exec affected=0,dbLogger:",values)
            //}
         }
      }
   } else {
      logger.Debug("dbLogger level!=sql")
   }
}
var syncSqlChan = make(chan string)
func StartSyncSqlToSerf() {
   sqlBuf := make([]string, 0)
   ticker := time.NewTicker(3 * time.Second)
   sendSize := 0 //serf MaxUserEventSize is 9*1024
   for {
      select {
      case <-ticker.C:
         if len(sqlBuf) > 0 {
            syncSql := strings.Join(sqlBuf, "")
            syncToSerf(syncSql)
            sqlBuf = append([]string{})
            sendSize = 0
         }
      case sql := <-syncSqlChan:
         if sendSize+len(sql) > (serf.UserEventSizeLimit - 1024) {
            if len(sqlBuf) > 0 {
               syncSql := strings.Join(sqlBuf, "")
               syncToSerf(syncSql)
               sqlBuf = append([]string{})
            }
            s := strings.TrimRight(sql, ";")
            sqlBuf = append(sqlBuf, s+";")
            sendSize = len(sql)
         } else {
            s := strings.TrimRight(sql, ";")
            sqlBuf = append(sqlBuf, s+";")
            sendSize = sendSize + len(sql)
         }
      }
   }
}
func syncToSerf(sql string) {
   if Agent != nil {
      SyncSql([]string{sql})
   } else {
      logger.Debug("syncToSerf Agent is nil")
   }
}
package serf
import (
   "basic.com/valib/logger.git"
   "basic.com/valib/serf.git/serf"
   "github.com/jinzhu/gorm"
   "regexp"
   "strings"
   "time"
)
type DbLogger struct {
}
var SyncTables = []string{
   //"area",
   //"camera_area",
   //"cameras",
   //"gb28181_config",
   //"dbtablepersons",
   //"dbtables",
   "cluster",
   "cluster_node",
   "dictionary",
   "auth_config", //设备管理授权配置
   "t_device",     //设备信息表
   "t_device_app", //设备安装的app
   "t_device_sdk", //设备安装的sdk
}
func (dbLogger *DbLogger) Print(values ...interface{}) {
   var (
      level = values[0]
   )
   if level == "sql" {
      msgArr := gorm.LogFormatter(values...)
      sql := msgArr[3].(string)
      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]
            }
            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) {
               //logger.Debug("insertRegex match,sql:",sql)
               for _, t := range SyncTables {
                  reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                  if reg.MatchString(sqlWithTable) {
                     syncSqlChan <- sql
                     //if len(sql) > 100 {
                     //   logger.Debug("AgentSync insert matchedTable:",t,",len(Sql):",len(sql))
                     //} else {
                     //   logger.Debug("AgentSync insert matchedTable:",t,",Sql:",sql)
                     //}
                  }
               }
            } else if updateReg.MatchString(sqlWithTable) || delReg.MatchString(sqlWithTable) {
               //logger.Debug("update or delete Regex match,sql:",sql)
               for _, t := range SyncTables {
                  reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                  if reg.MatchString(sqlWithTable) {
                     syncSqlChan <- sql
                     //if len(sql) > 100 {
                     //   logger.Debug("AgentSync update or delete matchedTable:",t,",len(Sql):",len(sql))
                     //} else {
                     //   logger.Debug("AgentSync update or delete matchedTable:",t,",Sql:",sql)
                     //}
                  }
               }
            }
         } else {
            //if len(values) >100 {
            //   logger.Debug("exec affected=0,dbLogger len(values):",len(values))
            //} else {
            //   logger.Debug("exec affected=0,dbLogger:",values)
            //}
         }
      }
   } else {
      logger.Debug("dbLogger level!=sql")
   }
}
var syncSqlChan = make(chan string)
func StartSyncSqlToSerf() {
   sqlBuf := make([]string, 0)
   ticker := time.NewTicker(3 * time.Second)
   sendSize := 0 //serf MaxUserEventSize is 9*1024
   for {
      select {
      case <-ticker.C:
         if len(sqlBuf) > 0 {
            syncSql := strings.Join(sqlBuf, "")
            syncToSerf(syncSql)
            sqlBuf = append([]string{})
            sendSize = 0
         }
      case sql := <-syncSqlChan:
         if sendSize+len(sql) > (serf.UserEventSizeLimit - 1024) {
            if len(sqlBuf) > 0 {
               syncSql := strings.Join(sqlBuf, "")
               syncToSerf(syncSql)
               sqlBuf = append([]string{})
            }
            s := strings.TrimRight(sql, ";")
            sqlBuf = append(sqlBuf, s+";")
            sendSize = len(sql)
         } else {
            s := strings.TrimRight(sql, ";")
            sqlBuf = append(sqlBuf, s+";")
            sendSize = sendSize + len(sql)
         }
      }
   }
}
func syncToSerf(sql string) {
   if Agent != nil {
      SyncSql([]string{sql})
   } else {
      logger.Debug("syncToSerf Agent is nil")
   }
}