-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathbuffer.go
More file actions
88 lines (71 loc) · 1.58 KB
/
buffer.go
File metadata and controls
88 lines (71 loc) · 1.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package dbs
import (
"bytes"
"sync"
)
const kDefaultArgsSize = 16
const kDefaultBufferSize = 1024
const (
FlagPlaceholder = uint8(1)
FlagArgument = uint8(2)
)
type Writer interface {
UseDialect(p Dialect)
Write(p []byte) (n int, err error)
WriteByte(c byte) error
WriteString(s string) (n int, err error)
WriteArgument(flag uint8, arg any) (err error)
Arguments() []any
}
var bufferPool = sync.Pool{
New: func() interface{} {
return &Buffer{
Buffer: bytes.NewBuffer(make([]byte, 0, kDefaultBufferSize)),
arguments: make([]any, 0, kDefaultArgsSize),
placeholderCount: 0,
}
},
}
type Buffer struct {
*bytes.Buffer
arguments []any
dialect Dialect
placeholderCount int
}
func NewBuffer() *Buffer {
var buffer = bufferPool.Get().(*Buffer)
buffer.Buffer.Reset()
buffer.arguments = buffer.arguments[:0]
buffer.dialect = nil
buffer.placeholderCount = 0
return buffer
}
func (b *Buffer) Release() {
bufferPool.Put(b)
}
func (b *Buffer) UseDialect(dialect Dialect) {
b.dialect = dialect
}
func (b *Buffer) WriteArgument(flag uint8, arg any) (err error) {
if flag&FlagArgument == FlagArgument {
b.arguments = append(b.arguments, arg)
}
if flag&FlagPlaceholder == FlagPlaceholder {
b.placeholderCount++
if b.dialect != nil {
if err = b.dialect.WritePlaceholder(b, b.placeholderCount); err != nil {
return err
}
} else {
if err = b.WriteByte('?'); err != nil {
return err
}
}
}
return nil
}
func (b *Buffer) Arguments() []any {
var args = make([]any, len(b.arguments))
copy(args, b.arguments)
return args
}