package serf import ( "errors" "fmt" "regexp" "strings" "github.com/jinzhu/gorm" ) type DumpSql struct { Sql string `json:"sql"` } type TableDesc struct { Cid int `json:"cid"` Name string `json:"name"` Type string `json:"type"` Notnull bool `json:"notnull"` DFltValue interface{} `json:"dflt_value"` Pk int `json:"pk"` } var syncSqlChan = make(chan string, 10) func DumpTables(db *gorm.DB, tableNames []string) ([]string, error) { db.LogMode(false) defer db.LogMode(true) if tableNames != nil { var arr []string var dumpSql []DumpSql for _, table := range tableNames { fmt.Println("dump current tableName:", table) dumpSql = make([]DumpSql, 0) var tDescArr []TableDesc 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") } var columnNames []string for _, col := range tDescArr { columnNames = append(columnNames, fmt.Sprintf(`'||quote("%s")||'`, col.Name)) } tSql = fmt.Sprintf(`SELECT 'INSERT INTO "%s" VALUES(%s)' as sql FROM "%s";`, table, strings.Join(columnNames, ","), table) //fmt.Println("tSql:", tSql) err = db.Raw(tSql).Scan(&dumpSql).Error if err != nil { return nil, errors.New("dump err") } if len(dumpSql) > 0 { for _, d := range dumpSql { arr = append(arr, d.Sql) } } } return arr, nil } 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") } }