From 23f0cad53f5ca1ed65e72eee157eefb20f645e7b Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Sat, 20 Jul 2019 14:28:16 -0700 Subject: [PATCH] internal/querytext: new package that extracts the parameter parser (#502) --- parser.go => internal/querytext/parser.go | 12 ++++++++++-- parser_test.go => internal/querytext/parser_test.go | 4 ++-- mssql.go | 4 +++- 3 files changed, 15 insertions(+), 5 deletions(-) rename parser.go => internal/querytext/parser.go (89%) rename parser_test.go => internal/querytext/parser_test.go (97%) diff --git a/parser.go b/internal/querytext/parser.go similarity index 89% rename from parser.go rename to internal/querytext/parser.go index 8021ca60..14650e38 100644 --- a/parser.go +++ b/internal/querytext/parser.go @@ -1,4 +1,8 @@ -package mssql +// Package querytext is the old query parser and parameter substitute process. +// Do not use on new code. +// +// This package is not subject to any API compatibility guarantee. +package querytext import ( "bytes" @@ -40,7 +44,11 @@ func (p *parser) write(ch rune) { type stateFunc func(*parser) stateFunc -func parseParams(query string) (string, int) { +// ParseParams rewrites the query from using "?" placeholders +// to using "@pN" parameter names that SQL Server will accept. +// +// This function and package is not subject to any API compatibility guarantee. +func ParseParams(query string) (string, int) { p := &parser{ r: bytes.NewReader([]byte(query)), namedParams: map[string]bool{}, diff --git a/parser_test.go b/internal/querytext/parser_test.go similarity index 97% rename from parser_test.go rename to internal/querytext/parser_test.go index d09250df..849be779 100644 --- a/parser_test.go +++ b/internal/querytext/parser_test.go @@ -1,4 +1,4 @@ -package mssql +package querytext import ( "testing" @@ -49,7 +49,7 @@ func TestParseParams(t *testing.T) { } for _, v := range values { - d, n := parseParams(v.s) + d, n := ParseParams(v.s) if d != v.d { t.Errorf("Parse params don't match for %s, got %s but expected %s", v.s, d, v.d) } diff --git a/mssql.go b/mssql.go index c7f8c482..cf84f3a1 100644 --- a/mssql.go +++ b/mssql.go @@ -14,6 +14,8 @@ import ( "strings" "time" "unicode" + + "github.com/denisenkom/go-mssqldb/internal/querytext" ) // ReturnStatus may be used to return the return value from a proc. @@ -385,7 +387,7 @@ func (c *Conn) Prepare(query string) (driver.Stmt, error) { func (c *Conn) prepareContext(ctx context.Context, query string) (*Stmt, error) { paramCount := -1 if c.processQueryText { - query, paramCount = parseParams(query) + query, paramCount = querytext.ParseParams(query) } return &Stmt{c, query, paramCount, nil}, nil }