zhangqian
2024-04-25 2d6875c93b25d0b7336c7fa11e066d213259fe2e
serf/sqlite.go
@@ -3,7 +3,6 @@
import (
   "errors"
   "fmt"
   "regexp"
   "strings"
   "github.com/jinzhu/gorm"
@@ -40,25 +39,25 @@
         tSql := fmt.Sprintf(`PRAGMA table_info("%s")`, table)
         err := db.Raw(tSql).Scan(&tDescArr).Error
         fmt.Println("tDescArr err:", err, "len(tDescArr)=", len(tDescArr))
         if err != nil {
            return nil, errors.New("tableDesc err")
         }
         fmt.Println(table, "'Columns is:", tDescArr)
         if tDescArr == nil || len(tDescArr) == 0 {
            return nil, errors.New(table + " has no column")
            continue
         }
         var columnNames []string
         var columnValues []string
         for _, col := range tDescArr {
            columnNames = append(columnNames, fmt.Sprintf(`'||quote("%s")||'`, col.Name))
            columnNames = append(columnNames, col.Name)
            columnValues = append(columnValues, fmt.Sprintf(`'||quote("%s")||'`, col.Name))
         }
         tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' as sql FROM "%s";`,
         tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" (%s) VALUES(%s)' as sql FROM "%s";`,
            table,
            strings.Join(columnNames, ","),
            strings.Join(columnValues, ","),
            table)
         //fmt.Println("tSql:", tSql)
@@ -78,60 +77,4 @@
   }
   return nil, errors.New("tableNames is nil")
}
type DbLogger struct {
}
func (dbLogger *DbLogger) Print(values ...interface{}) {
   var (
      level = values[0]
   )
   fmt.Println("dblogger", values)
   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]
            }
            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)
                     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)
                     syncSqlChan <- sql
                  }
               }
            }
         }
      }
   } else {
      fmt.Println("dbLogger level!=sql")
   }
}