mirror of
https://github.com/rclone/rclone
synced 2025-03-27 11:02:44 +01:00
drive: extract function for escaping search titles
Slight optimization opportunity. Instead of calling `strings.ReplaceAll` twice, we can loop over the search title once while minimizing unnecessary allocations.
This commit is contained in:
parent
b9de37af80
commit
370ae6f5f4
@ -806,6 +806,25 @@ func (f *Fs) getRootID(ctx context.Context) (string, error) {
|
|||||||
return info.Id, nil
|
return info.Id, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replaces `\` to `\\` and `'` to `\'`
|
||||||
|
// Escaping backslashes requirement is not documented
|
||||||
|
// See https://stackoverflow.com/a/32310092
|
||||||
|
func escapeSingleQuotesAndBackslashes(s string) string {
|
||||||
|
n := strings.Count(s, "\\") + strings.Count(s, "'")
|
||||||
|
var b strings.Builder
|
||||||
|
b.Grow(len(s) + n)
|
||||||
|
start := 0
|
||||||
|
for pos, c := range s {
|
||||||
|
if c == '\\' || c == '\'' {
|
||||||
|
b.WriteString(s[start:pos])
|
||||||
|
b.Write([]byte{'\\', byte(c)})
|
||||||
|
start = pos + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.WriteString(s[start:])
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
// Lists the directory required calling the user function on each item found
|
// Lists the directory required calling the user function on each item found
|
||||||
//
|
//
|
||||||
// If the user fn ever returns true then it early exits with found = true
|
// If the user fn ever returns true then it early exits with found = true
|
||||||
@ -860,8 +879,7 @@ func (f *Fs) list(ctx context.Context, dirIDs []string, title string, directorie
|
|||||||
if title != "" {
|
if title != "" {
|
||||||
searchTitle := f.opt.Enc.FromStandardName(title)
|
searchTitle := f.opt.Enc.FromStandardName(title)
|
||||||
// Escaping the backslash isn't documented but seems to work
|
// Escaping the backslash isn't documented but seems to work
|
||||||
searchTitle = strings.ReplaceAll(searchTitle, `\`, `\\`)
|
searchTitle = escapeSingleQuotesAndBackslashes(searchTitle)
|
||||||
searchTitle = strings.ReplaceAll(searchTitle, `'`, `\'`)
|
|
||||||
|
|
||||||
var titleQuery bytes.Buffer
|
var titleQuery bytes.Buffer
|
||||||
_, _ = fmt.Fprintf(&titleQuery, "(name='%s'", searchTitle)
|
_, _ = fmt.Fprintf(&titleQuery, "(name='%s'", searchTitle)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user