summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-pg/pg/v10/orm/composite_parser.go
diff options
context:
space:
mode:
authorLibravatar Tobi Smethurst <31960611+tsmethurst@users.noreply.github.com>2021-08-12 21:03:24 +0200
committerLibravatar GitHub <noreply@github.com>2021-08-12 21:03:24 +0200
commit98263a7de64269898a2f81207e38943b5c8e8653 (patch)
tree743c90f109a6c5d27832d1dcef2388d939f0f77a /vendor/github.com/go-pg/pg/v10/orm/composite_parser.go
parentText duplication fix (#137) (diff)
downloadgotosocial-98263a7de64269898a2f81207e38943b5c8e8653.tar.xz
Grand test fixup (#138)
* start fixing up tests * fix up tests + automate with drone * fiddle with linting * messing about with drone.yml * some more fiddling * hmmm * add cache * add vendor directory * verbose * ci updates * update some little things * update sig
Diffstat (limited to 'vendor/github.com/go-pg/pg/v10/orm/composite_parser.go')
-rw-r--r--vendor/github.com/go-pg/pg/v10/orm/composite_parser.go140
1 files changed, 140 insertions, 0 deletions
diff --git a/vendor/github.com/go-pg/pg/v10/orm/composite_parser.go b/vendor/github.com/go-pg/pg/v10/orm/composite_parser.go
new file mode 100644
index 000000000..29e500444
--- /dev/null
+++ b/vendor/github.com/go-pg/pg/v10/orm/composite_parser.go
@@ -0,0 +1,140 @@
+package orm
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "io"
+
+ "github.com/go-pg/pg/v10/internal/parser"
+ "github.com/go-pg/pg/v10/types"
+)
+
+var errEndOfComposite = errors.New("pg: end of composite")
+
+type compositeParser struct {
+ p parser.StreamingParser
+
+ stickyErr error
+}
+
+func newCompositeParserErr(err error) *compositeParser {
+ return &compositeParser{
+ stickyErr: err,
+ }
+}
+
+func newCompositeParser(rd types.Reader) *compositeParser {
+ p := parser.NewStreamingParser(rd)
+ err := p.SkipByte('(')
+ if err != nil {
+ return newCompositeParserErr(err)
+ }
+ return &compositeParser{
+ p: p,
+ }
+}
+
+func (p *compositeParser) NextElem() ([]byte, error) {
+ if p.stickyErr != nil {
+ return nil, p.stickyErr
+ }
+
+ c, err := p.p.ReadByte()
+ if err != nil {
+ if err == io.EOF {
+ return nil, errEndOfComposite
+ }
+ return nil, err
+ }
+
+ switch c {
+ case '"':
+ return p.readQuoted()
+ case ',':
+ return nil, nil
+ case ')':
+ return nil, errEndOfComposite
+ default:
+ _ = p.p.UnreadByte()
+ }
+
+ var b []byte
+ for {
+ tmp, err := p.p.ReadSlice(',')
+ if err == nil {
+ if b == nil {
+ b = tmp
+ } else {
+ b = append(b, tmp...)
+ }
+ b = b[:len(b)-1]
+ break
+ }
+ b = append(b, tmp...)
+ if err == bufio.ErrBufferFull {
+ continue
+ }
+ if err == io.EOF {
+ if b[len(b)-1] == ')' {
+ b = b[:len(b)-1]
+ break
+ }
+ }
+ return nil, err
+ }
+
+ if len(b) == 0 { // NULL
+ return nil, nil
+ }
+ return b, nil
+}
+
+func (p *compositeParser) readQuoted() ([]byte, error) {
+ var b []byte
+
+ c, err := p.p.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+
+ for {
+ next, err := p.p.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+
+ if c == '\\' || c == '\'' {
+ if next == c {
+ b = append(b, c)
+ c, err = p.p.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ b = append(b, c)
+ c = next
+ }
+ continue
+ }
+
+ if c == '"' {
+ switch next {
+ case '"':
+ b = append(b, '"')
+ c, err = p.p.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ case ',', ')':
+ return b, nil
+ default:
+ return nil, fmt.Errorf("pg: got %q, wanted ',' or ')'", c)
+ }
+ continue
+ }
+
+ b = append(b, c)
+ c = next
+ }
+}