-
Notifications
You must be signed in to change notification settings - Fork 128
/
queryignore_handler.go
82 lines (70 loc) · 2.56 KB
/
queryignore_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
Copyright 2018, Cossack Labs Limited
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package handlers
import (
"github.com/cossacklabs/acra/sqlparser"
log "github.com/sirupsen/logrus"
)
// QueryIgnoreHandler allows to ignore any query
type QueryIgnoreHandler struct {
ignoredQueries map[string]bool
logger *log.Entry
parser *sqlparser.Parser
}
// NewQueryIgnoreHandler creates new ignore handler
func NewQueryIgnoreHandler(parser *sqlparser.Parser) *QueryIgnoreHandler {
return &QueryIgnoreHandler{
ignoredQueries: make(map[string]bool),
logger: log.WithField("handler", "query-ignore"),
parser: parser,
}
}
// CheckQuery checks each query, returns false if query handling should be ignored.
func (handler *QueryIgnoreHandler) CheckQuery(rawQuery string, parsedQuery sqlparser.Statement) (bool, error) {
normalizedQ := sqlparser.String(parsedQuery)
if handler.ignoredQueries[normalizedQ] || handler.ignoredQueries[rawQuery] {
//do not continue query handling
return false, nil
}
return true, nil
}
// Reset resets list of ignored patterns
func (handler *QueryIgnoreHandler) Reset() {
handler.ignoredQueries = make(map[string]bool)
}
// Release resets list of ignored patterns
func (handler *QueryIgnoreHandler) Release() {
handler.Reset()
}
// AddQueries normalizes and adds queries to the list that should be ignored
func (handler *QueryIgnoreHandler) AddQueries(queries []string) {
for _, query := range queries {
handler.ignoredQueries[query] = true
normalizedQuery, _, _, err := handler.parser.HandleRawSQLQuery(query)
if err == nil {
handler.ignoredQueries[normalizedQuery] = true
} else {
handler.logger.Warningln("Can't add normalized query due to parse error, will add in raw form")
}
}
}
// RemoveQueries removes queries from the list that should be ignored
func (handler *QueryIgnoreHandler) RemoveQueries(queries []string) {
for _, query := range queries {
delete(handler.ignoredQueries, query)
normalizedQuery, _, _, err := handler.parser.HandleRawSQLQuery(query)
if err == nil {
delete(handler.ignoredQueries, normalizedQuery)
}
}
}