فهرست منبع

Make warning details accessible

Makes the details of MySQLWarnings accessible through an exported struct
Julien Schmidt 12 سال پیش
والد
کامیت
9d1f8ef3ff
1فایلهای تغییر یافته به همراه45 افزوده شده و 10 حذف شده
  1. 45 10
      errors.go

+ 45 - 10
errors.go

@@ -25,19 +25,30 @@ var (
 )
 
 // error type which represents one or more MySQL warnings
-type MySQLWarnings []string
+type MySQLWarnings []MySQLWarning
 
-func (mw MySQLWarnings) Error() string {
+func (mws MySQLWarnings) Error() string {
 	var msg string
-	for i := range mw {
+	for i := range mws {
 		if i > 0 {
 			msg += "\r\n"
 		}
-		msg += mw[i]
+		msg += mws[i].Error()
 	}
 	return msg
 }
 
+// error type which represents a single MySQL warning
+type MySQLWarning struct {
+	Level   string
+	Code    string
+	Message string
+}
+
+func (mw MySQLWarning) Error() string {
+	return fmt.Sprintf("%s %s: %s", mw.Level, mw.Code, mw.Message)
+}
+
 func (mc *mysqlConn) getWarnings() (err error) {
 	rows, err := mc.Query("SHOW WARNINGS", []driver.Value{})
 	if err != nil {
@@ -47,14 +58,38 @@ func (mc *mysqlConn) getWarnings() (err error) {
 	var warnings = MySQLWarnings{}
 	var values = make([]driver.Value, 3)
 
+	var warning MySQLWarning
+	var raw []byte
+	var ok bool
+
 	for {
-		if err = rows.Next(values); err == nil {
-			warnings = append(warnings,
-				fmt.Sprintf("%s %s: %s", values[0], values[1], values[2]),
-			)
-		} else if err == io.EOF {
+		err = rows.Next(values)
+		switch err {
+		case nil:
+			warning = MySQLWarning{}
+
+			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 {
+				warning.Code = string(raw)
+			} else {
+				warning.Code = fmt.Sprintf("%s", values[1])
+			}
+			if raw, ok = values[2].([]byte); ok {
+				warning.Message = string(raw)
+			} else {
+				warning.Message = fmt.Sprintf("%s", values[0])
+			}
+
+			warnings = append(warnings, warning)
+
+		case io.EOF:
 			return warnings
-		} else {
+
+		default:
 			rows.Close()
 			return
 		}