-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathutils.go
70 lines (60 loc) · 1.69 KB
/
utils.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
package db
import (
"net/url"
"reflect"
"strings"
"unicode"
)
func IsUrl(uri string) bool {
url, err := url.ParseRequestURI(uri)
if err != nil {
return false
}
return url.Scheme != ""
}
func IsValidSqldUrl(uri string) (bool, string) {
url, err := url.ParseRequestURI(uri)
if err != nil {
return false, ""
}
return url.Scheme == "libsql" || url.Scheme == "wss" || url.Scheme == "ws" || url.Scheme == "http" || url.Scheme == "https", url.Scheme
}
func EscapeSingleQuotes(value string) string {
return strings.Replace(value, "'", "''", -1)
}
func startsWithNumber(name string) bool {
firstChar := rune(name[0])
return unicode.IsNumber(firstChar)
}
func NeedsEscaping(name string) bool {
if len(name) == 0 {
return true
}
if startsWithNumber(name) {
return true
}
for _, char := range name {
if !unicode.IsLetter(char) && !unicode.IsNumber(char) && char != rune('_') {
return true
}
}
return false
}
var explainQueryPlanStatement = "EXPLAIN QUERY PLAN"
var explainQueryPlanColumnNames = []string{"id", "parent", "notused", "detail"}
func queryContainsExplainQueryPlanStatement(query string) bool {
return strings.HasPrefix(
strings.ToLower(query),
strings.ToLower(explainQueryPlanStatement),
)
}
func columnNamesMatchExplainQueryPlan(colNames []string) bool {
return reflect.DeepEqual(colNames, explainQueryPlanColumnNames)
}
// "query" can be a string containing multiple queries separated by ";" or a single query
func IsResultComingFromExplainQueryPlan(statementResult StatementResult) bool {
query := statementResult.Query
columnNames := statementResult.ColumnNames
return queryContainsExplainQueryPlanStatement(query) &&
columnNamesMatchExplainQueryPlan(columnNames)
}