Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"os"
)

// Various errors the driver might return. Can change between driver versions.
var (
ErrInvalidConn = errors.New("Invalid Connection")
ErrMalformPkt = errors.New("Malformed Packet")
Expand All @@ -27,17 +28,17 @@ var (
ErrPktSyncMul = errors.New("Commands out of sync. Did you run multiple statements at once?")
ErrPktTooLarge = errors.New("Packet for query is too large. You can change this value on the server by adjusting the 'max_allowed_packet' variable.")
ErrBusyBuffer = errors.New("Busy buffer")

errLog Logger = log.New(os.Stderr, "[MySQL] ", log.Ldate|log.Ltime|log.Lshortfile)
)

var errLog Logger = log.New(os.Stderr, "[MySQL] ", log.Ldate|log.Ltime|log.Lshortfile)

// Logger is used to log critical error messages.
type Logger interface {
Print(v ...interface{})
}

// SetLogger is used to set the logger for critical errors.
// The initial logger is stderr.
// The initial logger is os.Stderr.
func SetLogger(logger Logger) error {
if logger == nil {
return errors.New("logger is nil")
Expand All @@ -58,7 +59,7 @@ func (me *MySQLError) Error() string {

// MySQLWarnings is an error type which represents a group of one or more MySQL
// warnings
type MySQLWarnings []MysqlWarning
type MySQLWarnings []MySQLWarning

func (mws MySQLWarnings) Error() string {
var msg string
Expand All @@ -76,44 +77,40 @@ func (mws MySQLWarnings) Error() string {
return msg
}

// MysqlWarning is an error type which represents a single MySQL warning.
// MySQLWarning is an error type which represents a single MySQL warning.
// Warnings are returned in groups only. See MySQLWarnings
type MysqlWarning struct {
type MySQLWarning struct {
Level string
Code string
Message string
}

func (mc *mysqlConn) getWarnings() (err error) {
rows, err := mc.Query("SHOW WARNINGS", []driver.Value{})
rows, err := mc.Query("SHOW WARNINGS", nil)
if err != nil {
return
}

var warnings = MySQLWarnings{}
var values = make([]driver.Value, 3)

var warning MysqlWarning
var raw []byte
var ok bool

for {
err = rows.Next(values)
switch err {
case nil:
warning = MysqlWarning{}
warning := MySQLWarning{}

if raw, ok = values[0].([]byte); ok {
if raw, ok := values[0].([]byte); ok {
warning.Level = string(raw)
} else {
warning.Level = fmt.Sprintf("%s", values[0])
}
if raw, ok = values[1].([]byte); ok {
if raw, ok := values[1].([]byte); ok {
warning.Code = string(raw)
} else {
warning.Code = fmt.Sprintf("%s", values[1])
}
if raw, ok = values[2].([]byte); ok {
if raw, ok := values[2].([]byte); ok {
warning.Message = string(raw)
} else {
warning.Message = fmt.Sprintf("%s", values[0])
Expand Down
8 changes: 7 additions & 1 deletion errors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,22 @@ import (
"testing"
)

func TestSetLogger(t *testing.T) {
func TestErrorsSetLogger(t *testing.T) {
previous := errLog
defer func() {
errLog = previous
}()

// set up logger
const expected = "prefix: test\n"
buffer := bytes.NewBuffer(make([]byte, 0, 64))
logger := log.New(buffer, "prefix: ", 0)

// print
SetLogger(logger)
errLog.Print("test")

// check result
if actual := buffer.String(); actual != expected {
t.Errorf("expected %q, got %q", expected, actual)
}
Expand Down