| | |
| | | import ( |
| | | "errors" |
| | | "fmt" |
| | | "regexp" |
| | | "strings" |
| | | |
| | | "github.com/jinzhu/gorm" |
| | |
| | | |
| | | 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) |
| | | |
| | |
| | | } |
| | | |
| | | 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") |
| | | } |
| | | } |