From 430a6674557aa702cc6943251da87034759ee1a4 Mon Sep 17 00:00:00 2001 From: logan Date: Sat, 30 May 2026 14:47:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Redis=E5=91=BD=E4=BB=A4=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=94=AF=E6=8C=81=E5=BC=95=E5=8F=B7=E5=8F=82=E6=95=B0?= =?UTF-8?q?(parseCommandParts=E6=9B=BF=E4=BB=A3strings.Fields)\n\nstrings.?= =?UTF-8?q?Fields()=E4=BC=9A=E5=B0=86=E5=BC=95=E5=8F=B7=E5=BD=93=E4=BD=9C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=9A=84=E4=B8=80=E9=83=A8=E5=88=86,?= =?UTF-8?q?=E5=AF=BC=E8=87=B4HGET=E5=B8=A6=E5=BC=95=E5=8F=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A4=B1=E8=B4=A5\n=E6=96=B0=E5=A2=9EparseCommandPart?= =?UTF-8?q?s()=E5=87=BD=E6=95=B0=E6=94=AF=E6=8C=81=E5=8F=8C=E5=BC=95?= =?UTF-8?q?=E5=8F=B7=E5=92=8C=E5=8D=95=E5=BC=95=E5=8F=B7=E5=8C=85=E8=A3=B9?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/instance_detail.go | 44 ++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/backend/internal/handler/instance_detail.go b/backend/internal/handler/instance_detail.go index 90fd0c1..3ff8106 100644 --- a/backend/internal/handler/instance_detail.go +++ b/backend/internal/handler/instance_detail.go @@ -663,6 +663,48 @@ func executeSQLQuery(instance *model.Instance, dbName string, sqlStr string, lim }, nil } +// parseCommandParts splits a command string into parts, respecting quoted strings. +// e.g. HGET "my key" "my field" => ["HGET", "my key", "my field"] +func parseCommandParts(input string) []string { + var parts []string + var current strings.Builder + inQuote := false + quoteChar := byte(0) + + for i := 0; i < len(input); i++ { + ch := input[i] + if inQuote { + if ch == quoteChar { + inQuote = false + quoteChar = 0 + } else { + current.WriteByte(ch) + } + } else { + switch ch { + case '"', '\'': + if current.Len() > 0 { + parts = append(parts, current.String()) + current.Reset() + } + inQuote = true + quoteChar = ch + case ' ', '\t', '\n', '\r': + if current.Len() > 0 { + parts = append(parts, current.String()) + current.Reset() + } + default: + current.WriteByte(ch) + } + } + } + if current.Len() > 0 { + parts = append(parts, current.String()) + } + return parts +} + func executeRedisQuery(instance *model.Instance, dbSelect string, command string, limit int, offset int) (gin.H, error) { // Parse Redis DB number from dbSelect (e.g. "0", "1") redisDB := 0 @@ -680,7 +722,7 @@ func executeRedisQuery(instance *model.Instance, dbSelect string, command string ctx := context.Background() - parts := strings.Fields(command) + parts := parseCommandParts(command) if len(parts) == 0 { return nil, fmt.Errorf("empty command") }