mirror of
https://github.com/mattermost/mattermost.git
synced 2026-03-03 13:51:38 -05:00
90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package sqlstore
|
|
|
|
import (
|
|
"database/sql"
|
|
"strconv"
|
|
"strings"
|
|
"unicode"
|
|
|
|
"github.com/mattermost/gorp"
|
|
"github.com/mattermost/mattermost-server/v5/mlog"
|
|
)
|
|
|
|
var escapeLikeSearchChar = []string{
|
|
"%",
|
|
"_",
|
|
}
|
|
|
|
func sanitizeSearchTerm(term string, escapeChar string) string {
|
|
term = strings.Replace(term, escapeChar, "", -1)
|
|
|
|
for _, c := range escapeLikeSearchChar {
|
|
term = strings.Replace(term, c, escapeChar+c, -1)
|
|
}
|
|
|
|
return term
|
|
}
|
|
|
|
// Converts a list of strings into a list of query parameters and a named parameter map that can
|
|
// be used as part of a SQL query.
|
|
func MapStringsToQueryParams(list []string, paramPrefix string) (string, map[string]interface{}) {
|
|
var keys strings.Builder
|
|
params := make(map[string]interface{}, len(list))
|
|
for i, entry := range list {
|
|
if keys.Len() > 0 {
|
|
keys.WriteString(",")
|
|
}
|
|
|
|
key := paramPrefix + strconv.Itoa(i)
|
|
keys.WriteString(":" + key)
|
|
params[key] = entry
|
|
}
|
|
|
|
return "(" + keys.String() + ")", params
|
|
}
|
|
|
|
// finalizeTransaction ensures a transaction is closed after use, rolling back if not already committed.
|
|
func finalizeTransaction(transaction *gorp.Transaction) {
|
|
// Rollback returns sql.ErrTxDone if the transaction was already closed.
|
|
if err := transaction.Rollback(); err != nil && err != sql.ErrTxDone {
|
|
mlog.Error("Failed to rollback transaction", mlog.Err(err))
|
|
}
|
|
}
|
|
|
|
// removeNonAlphaNumericUnquotedTerms removes all unquoted words that only contain
|
|
// non-alphanumeric chars from given line
|
|
func removeNonAlphaNumericUnquotedTerms(line, separator string) string {
|
|
words := strings.Split(line, separator)
|
|
filteredResult := make([]string, 0, len(words))
|
|
|
|
for _, w := range words {
|
|
if isQuotedWord(w) || containsAlphaNumericChar(w) {
|
|
filteredResult = append(filteredResult, strings.TrimSpace(w))
|
|
}
|
|
}
|
|
return strings.Join(filteredResult, separator)
|
|
}
|
|
|
|
// containsAlphaNumericChar returns true in case any letter or digit is present, false otherwise
|
|
func containsAlphaNumericChar(s string) bool {
|
|
for _, r := range s {
|
|
if unicode.IsLetter(r) || unicode.IsDigit(r) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// isQuotedWord return true if the input string is quoted, false otherwise. Ex :-
|
|
// "quoted string" - will return true
|
|
// unquoted string - will return false
|
|
func isQuotedWord(s string) bool {
|
|
if len(s) < 2 {
|
|
return false
|
|
}
|
|
|
|
return s[0] == '"' && s[len(s)-1] == '"'
|
|
}
|