Skip to content

Commit 898a35e

Browse files
authored
feat: Add support for header comments in ORM-generated queries (#2011)
* feat: Added comment for public functions feat: Add query comments to headers for improved debugging This feature enhances debugging by including query comments in headers, allowing developers to trace the query's origin. By matching the query comment in the header, it's easier to identify the specific location in the code where the query was executed. * feat: Fixed query buffer append * feat: Changed query comment template * Reverted changes in test * Revised query comment implementation * Fixed appendComment func doc * Kept if cond only inside appendComment * Implemented tests for appendComment to verify proper escaping of comment symbols
1 parent 30e7053 commit 898a35e

11 files changed

+57
-0
lines changed

orm/composite_create.go

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func (q *CreateCompositeQuery) AppendTemplate(b []byte) ([]byte, error) {
5353
}
5454

5555
func (q *CreateCompositeQuery) AppendQuery(fmter QueryFormatter, b []byte) ([]byte, error) {
56+
b = appendComment(b, q.q.comment)
5657
if q.q.stickyErr != nil {
5758
return nil, q.q.stickyErr
5859
}

orm/composite_drop.go

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func (q *DropCompositeQuery) AppendTemplate(b []byte) ([]byte, error) {
5050
}
5151

5252
func (q *DropCompositeQuery) AppendQuery(fmter QueryFormatter, b []byte) ([]byte, error) {
53+
b = appendComment(b, q.q.comment)
5354
if q.q.stickyErr != nil {
5455
return nil, q.q.stickyErr
5556
}

orm/delete.go

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func (q *DeleteQuery) AppendTemplate(b []byte) ([]byte, error) {
5252
}
5353

5454
func (q *DeleteQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
55+
b = appendComment(b, q.q.comment)
5556
if q.q.stickyErr != nil {
5657
return nil, q.q.stickyErr
5758
}

orm/insert.go

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ func (q *InsertQuery) AppendTemplate(b []byte) ([]byte, error) {
5656
var _ QueryAppender = (*InsertQuery)(nil)
5757

5858
func (q *InsertQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
59+
b = appendComment(b, q.q.comment)
5960
if q.q.stickyErr != nil {
6061
return nil, q.q.stickyErr
6162
}

orm/query.go

+7
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ type Query struct {
8181

8282
onConflict *SafeQueryAppender
8383
returning []*SafeQueryAppender
84+
comment string
8485
}
8586

8687
func NewQuery(db DB, model ...interface{}) *Query {
@@ -779,6 +780,12 @@ func (q *Query) Apply(fn func(*Query) (*Query, error)) *Query {
779780
return qq
780781
}
781782

783+
// Comment adds a comment to the query, wrapped by /* ... */.
784+
func (q *Query) Comment(c string) *Query {
785+
q.comment = c
786+
return q
787+
}
788+
782789
// Count returns number of rows matching the query using count aggregate function.
783790
func (q *Query) Count() (int, error) {
784791
if q.stickyErr != nil {

orm/select.go

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func (q *SelectQuery) AppendTemplate(b []byte) ([]byte, error) {
5353
}
5454

5555
func (q *SelectQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) { //nolint:gocyclo
56+
b = appendComment(b, q.q.comment)
5657
if q.q.stickyErr != nil {
5758
return nil, q.q.stickyErr
5859
}

orm/table_create.go

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func (q *CreateTableQuery) AppendTemplate(b []byte) ([]byte, error) {
6464
}
6565

6666
func (q *CreateTableQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
67+
b = appendComment(b, q.q.comment)
6768
if q.q.stickyErr != nil {
6869
return nil, q.q.stickyErr
6970
}

orm/table_drop.go

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func (q *DropTableQuery) AppendTemplate(b []byte) ([]byte, error) {
5050
}
5151

5252
func (q *DropTableQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
53+
b = appendComment(b, q.q.comment)
5354
if q.q.stickyErr != nil {
5455
return nil, q.q.stickyErr
5556
}

orm/update.go

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ func (q *UpdateQuery) AppendTemplate(b []byte) ([]byte, error) {
5757
}
5858

5959
func (q *UpdateQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
60+
b = appendComment(b, q.q.comment)
6061
if q.q.stickyErr != nil {
6162
return nil, q.q.stickyErr
6263
}

orm/util.go

+12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package orm
22

33
import (
4+
"fmt"
45
"reflect"
6+
"strings"
57

68
"github.com/go-pg/pg/v10/types"
79
)
@@ -149,3 +151,13 @@ func appendColumns(b []byte, table types.Safe, fields []*Field) []byte {
149151
}
150152
return b
151153
}
154+
155+
// appendComment adds comment in the header of the query into buffer
156+
func appendComment(b []byte, name string) []byte {
157+
if name == "" {
158+
return b
159+
}
160+
name = strings.ReplaceAll(name, `/*`, `/\*`)
161+
name = strings.ReplaceAll(name, `*/`, `*\/`)
162+
return append(b, fmt.Sprintf("/* %s */ ", name)...)
163+
}

orm/util_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package orm
2+
3+
import (
4+
. "github.com/onsi/ginkgo"
5+
. "github.com/onsi/gomega"
6+
)
7+
8+
var _ = Describe("Comment - escape comment symbols", func() {
9+
It("only open sequence", func() {
10+
var res []byte
11+
c := "/* comment"
12+
13+
s := appendComment(res, c)
14+
Expect(s).To(Equal([]byte("/* /\\* comment */ ")))
15+
})
16+
It("only close sequence", func() {
17+
var res []byte
18+
c := "comment */"
19+
20+
s := appendComment(res, c)
21+
Expect(s).To(Equal([]byte("/* comment *\\/ */ ")))
22+
})
23+
It("open and close sequences", func() {
24+
var res []byte
25+
c := "/* comment */"
26+
27+
s := appendComment(res, c)
28+
Expect(s).To(Equal([]byte("/* /\\* comment *\\/ */ ")))
29+
})
30+
})

0 commit comments

Comments
 (0)