Browse Source

Make warning details accessible

Makes the details of MySQLWarnings accessible through an exported struct
Julien Schmidt 12 years ago
parent
commit
9d1f8ef3ff
1 changed files with 45 additions and 10 deletions
  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
 		}