@@ -25,6 +25,12 @@ const (
2525 CmdBatchOne = ":batchone"
2626)
2727
28+ type CmdParams struct {
29+ ManyKey string
30+ InsertMultiple bool
31+ NoInference bool
32+ }
33+
2834// A query name must be a valid Go identifier
2935//
3036// https://golang.org/ref/spec#Identifiers
@@ -44,7 +50,7 @@ func validateQueryName(name string) error {
4450 return nil
4551}
4652
47- func Parse (t string , commentStyle CommentSyntax ) (string , string , error ) {
53+ func Parse (t string , commentStyle CommentSyntax ) (string , string , CmdParams , error ) {
4854 for _ , line := range strings .Split (t , "\n " ) {
4955 var prefix string
5056 if strings .HasPrefix (line , "--" ) {
@@ -76,30 +82,56 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) {
7682 continue
7783 }
7884 if ! strings .HasPrefix (rest , " name: " ) {
79- return "" , "" , fmt .Errorf ("invalid metadata: %s" , line )
85+ return "" , "" , CmdParams {}, fmt .Errorf ("invalid metadata: %s" , line )
8086 }
8187
8288 part := strings .Split (strings .TrimSpace (line ), " " )
8389 if prefix == "/*" {
8490 part = part [:len (part )- 1 ] // removes the trailing "*/" element
8591 }
8692 if len (part ) == 2 {
87- return "" , "" , fmt .Errorf ("missing query type [':one', ':many', ':exec', ':execrows', ':execlastid', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s" , line )
88- }
89- if len (part ) != 4 {
90- return "" , "" , fmt .Errorf ("invalid query comment: %s" , line )
93+ return "" , "" , CmdParams {}, fmt .Errorf ("missing query type [':one', ':many', ':exec', ':execrows', ':execlastid', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s" , line )
9194 }
9295 queryName := part [2 ]
9396 queryType := strings .TrimSpace (part [3 ])
9497 switch queryType {
9598 case CmdOne , CmdMany , CmdExec , CmdExecResult , CmdExecRows , CmdExecLastId , CmdCopyFrom , CmdBatchExec , CmdBatchMany , CmdBatchOne :
9699 default :
97- return "" , "" , fmt .Errorf ("invalid query type: %s" , queryType )
100+ return "" , "" , CmdParams {}, fmt .Errorf ("invalid query type: %s" , queryType )
98101 }
99102 if err := validateQueryName (queryName ); err != nil {
100- return "" , "" , err
103+ return "" , "" , CmdParams {}, err
104+ }
105+ cmdParams , err := parseCmdParams (part [4 :], queryType )
106+ if err != nil {
107+ return "" , "" , CmdParams {}, err
108+ }
109+ return queryName , queryType , cmdParams , nil
110+ }
111+ return "" , "" , CmdParams {}, nil
112+ }
113+
114+ func parseCmdParams (part []string , queryType string ) (CmdParams , error ) {
115+ var ret CmdParams
116+ for _ , p := range part {
117+ if p == "multiple" {
118+ if queryType != CmdExec && queryType != CmdExecResult && queryType != CmdExecRows && queryType != CmdExecLastId {
119+ return ret , fmt .Errorf ("query command parameter multiple is invalid for query type %s" , queryType )
120+ }
121+ ret .InsertMultiple = true
122+ } else if p == "no-inference" {
123+ if queryType != CmdExec && queryType != CmdExecResult && queryType != CmdExecRows && queryType != CmdExecLastId {
124+ return ret , fmt .Errorf ("query command parameter no-inference is invalid for query type %s" , queryType )
125+ }
126+ ret .NoInference = true
127+ } else if strings .HasPrefix (p , "key=" ) {
128+ if queryType != CmdMany {
129+ return ret , fmt .Errorf ("query command parameter %s is invalid for query type %s" , p , queryType )
130+ }
131+ ret .ManyKey = strings .TrimPrefix (p , "key=" )
132+ } else {
133+ return ret , fmt .Errorf ("invalid query command parameter %q" , p )
101134 }
102- return queryName , queryType , nil
103135 }
104- return "" , "" , nil
136+ return ret , nil
105137}
0 commit comments