Skip to content

Commit c0cbcd9

Browse files
committed
refactor: error format and function
1 parent 1b6578c commit c0cbcd9

File tree

12 files changed

+194
-160
lines changed

12 files changed

+194
-160
lines changed

code/code.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package code
22

3-
type Code uint16
4-
53
// https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
64
// https://dev.mysql.com/doc/refman/8.0/en/error-message-elements.html
75

6+
type Err uint16
7+
88
// 1 to 999: Global error codes.
99
// This error code range is called “global” because it is a shared range
1010
// that is used by the server as well as by clients.
@@ -18,9 +18,9 @@ const ()
1818

1919
// 1,000 to 1,999: Server error codes reserved for messages sent to clients.
2020
const (
21-
ErrNo Code = 1002
22-
ErrYes Code = 1003
23-
ErrAccessDeniedError Code = 1045
21+
ErrNo Err = 1002
22+
ErrYes Err = 1003
23+
ErrAccessDeniedError Err = 1045
2424
)
2525

2626
// 2,000 to 2,999: Client error codes reserved for use by the client library.
@@ -37,14 +37,16 @@ const ()
3737
// zeros to six digits and adding a prefix of MY-.
3838
const ()
3939

40-
// 50,000 to 51,999: Error codes reserved for use by third parties (not sent to clients).
40+
// 50,000 to 51,999: Error codes reserved for use by third parties.
4141
const (
4242
// ErrSendToClient reserved for messages sent to clients.
43-
ErrSendToClient Code = 50000
43+
ErrSendToClient Err = 50000
4444

4545
// ErrClient reserved only for use by the client library.
46-
ErrClient Code = 50600
46+
ErrClient Err = 50600
4747

4848
// ErrServer reserved for messages to be written to the error log (not sent to clients).
49-
ErrServer Code = 51200
49+
ErrServer Err = 51200
50+
51+
ErrUndefined Err = 51999
5052
)

myerrors/error.go

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package myerrors
2+
3+
import (
4+
"fmt"
5+
"github.com/vczyh/mysql-protocol/code"
6+
)
7+
8+
// https://dev.mysql.com/doc/refman/8.0/en/error-message-elements.html
9+
10+
const (
11+
ServerName = "Server"
12+
SQLStateDef = "HY000"
13+
)
14+
15+
type fundamental struct {
16+
// name represents server module, only used by server side error message.
17+
name string
18+
code code.Err
19+
sqlState string
20+
message string
21+
}
22+
23+
func New(name string, c code.Err, state, msg string) error {
24+
return &fundamental{
25+
name: name,
26+
code: c,
27+
sqlState: state,
28+
message: msg,
29+
}
30+
}
31+
32+
func NewServer(c code.Err, msg string) error {
33+
return New("Server", c, SQLStateDef, msg)
34+
}
35+
36+
func NewServerWithSQLState(c code.Err, state, msg string) error {
37+
return New("Server", c, state, msg)
38+
}
39+
40+
func Name(err error) string {
41+
if err == nil {
42+
return ""
43+
}
44+
if val, ok := err.(*fundamental); ok {
45+
return val.name
46+
}
47+
return ""
48+
}
49+
50+
func Code(err error) code.Err {
51+
if err == nil {
52+
return code.ErrUndefined
53+
}
54+
if val, ok := err.(*fundamental); ok {
55+
return val.code
56+
}
57+
return code.ErrUndefined
58+
}
59+
60+
func SQLState(err error) string {
61+
if err == nil {
62+
return SQLStateDef
63+
}
64+
if val, ok := err.(*fundamental); ok {
65+
return val.sqlState
66+
}
67+
return SQLStateDef
68+
}
69+
70+
func Message(err error) string {
71+
if err == nil {
72+
return ""
73+
}
74+
if val, ok := err.(*fundamental); ok {
75+
return val.message
76+
}
77+
return ""
78+
}
79+
80+
func CanSendToClient(err error) bool {
81+
if err == nil {
82+
return false
83+
}
84+
if val, ok := err.(*fundamental); ok {
85+
c := val.code
86+
return c >= 1000 && c <= 1999 || c >= 3000 && c <= 4999 || c >= 5000 && c <= 5999 || c == 50000
87+
}
88+
return false
89+
}
90+
91+
func Client(err error) string {
92+
if err == nil {
93+
return ""
94+
}
95+
if val, ok := err.(*fundamental); ok {
96+
return fmt.Sprintf("ERROR %d (%s): %s", val.code, val.sqlState, val.message)
97+
}
98+
return ""
99+
}
100+
101+
func Server(err error) string {
102+
if err == nil {
103+
return ""
104+
}
105+
if val, ok := err.(*fundamental); ok {
106+
return fmt.Sprintf("[MY-%06d] [%s] %s", val.code, val.name, val.message)
107+
}
108+
return ""
109+
}
110+
111+
func (e *fundamental) Error() string {
112+
return fmt.Sprintf("%d (%s): %s", e.code, e.sqlState, e.message)
113+
}
114+
115+
func Is(e error) bool {
116+
_, ok := e.(*fundamental)
117+
return ok
118+
}

myerrors/template.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package myerrors
2+
3+
import (
4+
"fmt"
5+
"github.com/vczyh/mysql-protocol/code"
6+
)
7+
8+
// https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
9+
var (
10+
AccessDenied = NewTemplate(ServerName, code.ErrAccessDeniedError, "28000", "Access denied for user '%s'@'%s' (using password: %s)")
11+
)
12+
13+
type template struct {
14+
name string
15+
code code.Err
16+
sqlState string
17+
format string
18+
}
19+
20+
func NewTemplate(name string, c code.Err, state, format string) *template {
21+
return &template{
22+
name: name,
23+
code: c,
24+
sqlState: state,
25+
format: format,
26+
}
27+
}
28+
29+
func (t *template) Build(args ...interface{}) error {
30+
message := fmt.Sprintf(t.format, args...)
31+
return New(t.name, t.code, t.sqlState, message)
32+
}

mysql/conn.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"encoding/hex"
66
"fmt"
77
"github.com/vczyh/mysql-protocol/flag"
8-
"github.com/vczyh/mysql-protocol/mysqlerror"
8+
"github.com/vczyh/mysql-protocol/myerrors"
99
"github.com/vczyh/mysql-protocol/packet"
1010
"net"
1111
)
@@ -170,17 +170,12 @@ func (c *mysqlConn) WriteEmptyOK() error {
170170
}
171171

172172
func (c *mysqlConn) WriteError(err error) error {
173-
if err == nil {
173+
if !myerrors.Is(err) {
174174
return nil
175175
}
176176

177-
mysqlErr, ok := err.(mysqlerror.Error)
178-
if !ok {
179-
return nil
180-
}
181-
182-
if mysqlErr.CanSendToClient() {
183-
return c.WritePacket(packet.NewERR(mysqlErr))
177+
if myerrors.CanSendToClient(err) {
178+
return c.WritePacket(packet.NewERR(err))
184179
}
185180
return nil
186181
}

mysqlerror/error.go

Lines changed: 0 additions & 83 deletions
This file was deleted.

mysqlerror/template.go

Lines changed: 0 additions & 34 deletions
This file was deleted.

mysqllog/logger.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package mysqllog
22

33
import (
44
"errors"
5-
"github.com/vczyh/mysql-protocol/mysqlerror"
5+
"github.com/vczyh/mysql-protocol/myerrors"
66
"io"
77
"log"
88
)
@@ -74,8 +74,8 @@ func (l *DefaultLogger) log(lev Level, err error) {
7474
if lev < l.lev {
7575
return
7676
}
77-
if mysqlErr, ok := err.(mysqlerror.Error); ok {
78-
l.logger.Printf("%s %s\n", lev.String(), mysqlErr.Server())
77+
if myerrors.Is(err) {
78+
l.logger.Printf("%s %s\n", lev.String(), myerrors.Server(err))
7979
return
8080
}
8181
l.logger.Printf("%s %s", lev.String(), err.Error())

0 commit comments

Comments
 (0)