//parse the blacklist sql file func (s *Server) parseBlackListSqls() error { bs := new(BlacklistSqls) bs.sqls = make(map[string]string) if len(s.cfg.BlsFile) != 0 { file, err := os.Open(s.cfg.BlsFile) if err != nil { return err } defer file.Close() rd := bufio.NewReader(file) for { line, err := rd.ReadString('\n') //end of file if err == io.EOF { break } if err != nil { return err } line = strings.TrimSpace(line) if len(line) != 0 { fingerPrint := mysql.GetFingerprint(line) md5 := mysql.GetMd5(fingerPrint) bs.sqls[md5] = fingerPrint } } } bs.sqlsLen = len(bs.sqls) s.blacklistSqls = bs return nil }
func (s *Server) DelBlackSql(v string) error { v = strings.TrimSpace(v) fingerPrint := mysql.GetFingerprint(v) md5 := mysql.GetMd5(fingerPrint) if s.blacklistSqlsIndex == 0 { if _, ok := s.blacklistSqls[0].sqls[md5]; !ok { return errors.ErrBlackSqlNotExist } s.blacklistSqls[1] = s.blacklistSqls[0] s.blacklistSqls[1].sqls[md5] = v delete(s.blacklistSqls[1].sqls, md5) s.blacklistSqls[1].sqlsLen -= 1 atomic.StoreInt32(&s.blacklistSqlsIndex, 1) } else { if _, ok := s.blacklistSqls[1].sqls[md5]; !ok { return errors.ErrBlackSqlNotExist } s.blacklistSqls[0] = s.blacklistSqls[1] s.blacklistSqls[0].sqls[md5] = v delete(s.blacklistSqls[0].sqls, md5) s.blacklistSqls[0].sqlsLen -= 1 atomic.StoreInt32(&s.blacklistSqlsIndex, 0) } return nil }
func (c *ClientConn) isBlacklistSql(sql string) bool { fingerprint := mysql.GetFingerprint(sql) md5 := mysql.GetMd5(fingerprint) if _, ok := c.proxy.blacklistSqls[c.proxy.blacklistSqlsIndex].sqls[md5]; ok { return true } return false }
func (s *Server) addBlackSql(v string) error { v = strings.TrimSpace(v) fingerPrint := mysql.GetFingerprint(v) md5 := mysql.GetMd5(fingerPrint) if s.blacklistSqlsIndex == 0 { s.blacklistSqls[1] = s.blacklistSqls[0] s.blacklistSqls[1].sqls[md5] = v atomic.StoreInt32(&s.blacklistSqlsIndex, 1) } else { s.blacklistSqls[0] = s.blacklistSqls[1] s.blacklistSqls[0].sqls[md5] = v atomic.StoreInt32(&s.blacklistSqlsIndex, 0) } return nil }