mirror of
https://github.com/harness/drone.git
synced 2025-05-08 17:39:58 +08:00
61 lines
1.9 KiB
Go
61 lines
1.9 KiB
Go
// Copyright 2023 Harness, Inc.
|
|
//
|
|
// 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 database
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
PostgresDriverName = "postgres"
|
|
SqliteDriverName = "sqlite3"
|
|
)
|
|
|
|
// PartialMatch builds a string pair that can be passed as a parameter to squirrel's Where() function
|
|
// for a SQL "LIKE" expression. Besides surrounding the input value with '%' wildcard characters for a partial match,
|
|
// this function also escapes the '_' and '%' metacharacters supported in SQL "LIKE" expressions.
|
|
// The "ESCAPE" clause isn't needed for Postgres, but is necessary for SQLite.
|
|
// It will be used only if '_' and '%' are present in the value string.
|
|
//
|
|
// See:
|
|
// https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE
|
|
// https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_match_and_extract_operators
|
|
func PartialMatch(column, value string) (string, string) {
|
|
var (
|
|
n int
|
|
escaped bool
|
|
)
|
|
|
|
if n, value = len(value), strings.ReplaceAll(value, `\`, `\\`); n < len(value) {
|
|
escaped = true
|
|
}
|
|
if n, value = len(value), strings.ReplaceAll(value, "_", `\_`); n < len(value) {
|
|
escaped = true
|
|
}
|
|
if n, value = len(value), strings.ReplaceAll(value, "%", `\%`); n < len(value) {
|
|
escaped = true
|
|
}
|
|
|
|
sb := strings.Builder{}
|
|
sb.WriteString("LOWER(")
|
|
sb.WriteString(column)
|
|
sb.WriteString(") LIKE '%' || LOWER(?) || '%'")
|
|
if escaped {
|
|
sb.WriteString(` ESCAPE '\'`)
|
|
}
|
|
|
|
return sb.String(), value
|
|
}
|