From a7a6d970be0b818c61f622ef8cbeb50685374780 Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Fri, 14 Nov 2025 19:13:41 +0000 Subject: [PATCH] Copy parseURL function to where it's used --- pkg/api/datasource/validation.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/api/datasource/validation.go b/pkg/api/datasource/validation.go index f834cec4e1f..53e41a93ebf 100644 --- a/pkg/api/datasource/validation.go +++ b/pkg/api/datasource/validation.go @@ -9,7 +9,6 @@ import ( "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/datasources" - "github.com/grafana/grafana/pkg/tsdb/mssql" ) var logger = log.New("datasource") @@ -71,7 +70,7 @@ func ValidateURL(typeName, urlStr string) (*url.URL, error) { var err error switch strings.ToLower(typeName) { case "mssql": - u, err = mssql.ParseURL(urlStr, logger) + u, err = parseURL(urlStr, logger) default: logger.Debug("Applying default URL parsing for this data source type", "type", typeName, "url", urlStr) @@ -90,3 +89,28 @@ func ValidateURL(typeName, urlStr string) (*url.URL, error) { return u, nil } + +type DebugOnlyLogger interface { + Debug(msg string, args ...interface{}) +} + +// ParseURL tries to parse an URL string into a URL object. +func parseURL(u string, logger DebugOnlyLogger) (*url.URL, error) { + logger.Debug("Parsing URL", "url", u) + + // Recognize ODBC connection strings like host\instance:1234 + reODBC := regexp.MustCompile(`^[^\\:]+(?:\\[^:]+)?(?::\d+)?(?:;.+)?$`) + var host string + switch { + case reODBC.MatchString(u): + logger.Debug("Recognized as ODBC URL format", "url", u) + host = u + default: + logger.Debug("Couldn't recognize as valid MSSQL URL", "url", u) + return nil, fmt.Errorf("unrecognized URL format: %q", u) + } + return &url.URL{ + Scheme: "sqlserver", + Host: host, + }, nil +}