forked from si3nloong/sqlike
-
Notifications
You must be signed in to change notification settings - Fork 0
/
statement.go
107 lines (93 loc) · 1.67 KB
/
statement.go
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package sqlstmt
import (
"fmt"
"io"
"strings"
"time"
)
// Stmt :
type Stmt interface {
io.StringWriter
io.ByteWriter
fmt.Stringer
Args() []interface{}
AppendArgs(args ...interface{})
}
// Formatter :
type Formatter interface {
Format(it interface{}) string
Var(i int) string
}
// Statement :
type Statement struct {
strings.Builder
start time.Time
elapsed time.Duration
fmt Formatter
c int
args []interface{}
}
// NewStatement :
func NewStatement(fmt Formatter) (sm *Statement) {
sm = new(Statement)
sm.fmt = fmt
return
}
// Args :
func (sm *Statement) Args() []interface{} {
return sm.args
}
// AppendArgs :
func (sm *Statement) AppendArgs(args ...interface{}) {
sm.args = append(sm.args, args...)
sm.c = len(sm.args)
}
// Format :
func (sm *Statement) Format(state fmt.State, verb rune) {
if sm.fmt == nil {
state.Write([]byte(`missing formatter, unable to debug`))
return
}
str := sm.String()
if !state.Flag('+') {
state.Write([]byte(str))
return
}
var (
i = 1
args = sm.Args()
idx int
)
for {
idx = strings.Index(str, sm.fmt.Var(i))
if idx < 0 {
state.Write([]byte(str))
break
}
state.Write([]byte(str[:idx]))
state.Write([]byte(sm.fmt.Format(args[0])))
str = str[idx+1:]
args = args[1:]
i++
}
}
// StartTimer :
func (sm *Statement) StartTimer() {
sm.start = time.Now()
}
// StopTimer :
func (sm *Statement) StopTimer() {
sm.elapsed = time.Since(sm.start)
}
// TimeElapsed :
func (sm *Statement) TimeElapsed() time.Duration {
if sm.elapsed < 0 {
sm.StopTimer()
}
return sm.elapsed
}
// Reset : implement resetter as strings.Builer
func (sm *Statement) Reset() {
sm.args = nil
sm.Builder.Reset()
}