github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/mysql/errors.go (about)

     1  // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
     2  //
     3  // Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved.
     4  //
     5  // This Source Code Form is subject to the terms of the Mozilla Public
     6  // License, v. 2.0. If a copy of the MPL was not distributed with this file,
     7  // You can obtain one at http://mozilla.org/MPL/2.0/.
     8  
     9  package mysql
    10  
    11  import (
    12  	"database/sql/driver"
    13  	"errors"
    14  	"fmt"
    15  	"io"
    16  	"log"
    17  	"os"
    18  )
    19  
    20  // Various errors the driver might return. Can change between driver versions.
    21  var (
    22  	ErrInvalidConn = errors.New("Invalid Connection")
    23  	ErrMalformPkt  = errors.New("Malformed Packet")
    24  	ErrNoTLS       = errors.New("TLS encryption requested but server does not support TLS")
    25  	ErrOldPassword = errors.New("This server only supports the insecure old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords")
    26  	ErrOldProtocol = errors.New("MySQL-Server does not support required Protocol 41+")
    27  	ErrPktSync     = errors.New("Commands out of sync. You can't run this command now")
    28  	ErrPktSyncMul  = errors.New("Commands out of sync. Did you run multiple statements at once?")
    29  	ErrPktTooLarge = errors.New("Packet for query is too large. You can change this value on the server by adjusting the 'max_allowed_packet' variable.")
    30  	ErrBusyBuffer  = errors.New("Busy buffer")
    31  )
    32  
    33  var errLog Logger = log.New(os.Stderr, "[MySQL] ", log.Ldate|log.Ltime|log.Lshortfile)
    34  
    35  // Logger is used to log critical error messages.
    36  type Logger interface {
    37  	Print(v ...interface{})
    38  }
    39  
    40  // SetLogger is used to set the logger for critical errors.
    41  // The initial logger is os.Stderr.
    42  func SetLogger(logger Logger) error {
    43  	if logger == nil {
    44  		return errors.New("logger is nil")
    45  	}
    46  	errLog = logger
    47  	return nil
    48  }
    49  
    50  // MySQLError is an error type which represents a single MySQL error
    51  type MySQLError struct {
    52  	Number  uint16
    53  	Message string
    54  }
    55  
    56  func (me *MySQLError) Error() string {
    57  	return fmt.Sprintf("Error %d: %s", me.Number, me.Message)
    58  }
    59  
    60  // MySQLWarnings is an error type which represents a group of one or more MySQL
    61  // warnings
    62  type MySQLWarnings []MySQLWarning
    63  
    64  func (mws MySQLWarnings) Error() string {
    65  	var msg string
    66  	for i, warning := range mws {
    67  		if i > 0 {
    68  			msg += "\r\n"
    69  		}
    70  		msg += fmt.Sprintf(
    71  			"%s %s: %s",
    72  			warning.Level,
    73  			warning.Code,
    74  			warning.Message,
    75  		)
    76  	}
    77  	return msg
    78  }
    79  
    80  // MySQLWarning is an error type which represents a single MySQL warning.
    81  // Warnings are returned in groups only. See MySQLWarnings
    82  type MySQLWarning struct {
    83  	Level   string
    84  	Code    string
    85  	Message string
    86  }
    87  
    88  func (mc *mysqlConn) getWarnings() (err error) {
    89  	rows, err := mc.Query("SHOW WARNINGS", nil)
    90  	if err != nil {
    91  		return
    92  	}
    93  
    94  	var warnings = MySQLWarnings{}
    95  	var values = make([]driver.Value, 3)
    96  
    97  	for {
    98  		err = rows.Next(values)
    99  		switch err {
   100  		case nil:
   101  			warning := MySQLWarning{}
   102  
   103  			if raw, ok := values[0].([]byte); ok {
   104  				warning.Level = string(raw)
   105  			} else {
   106  				warning.Level = fmt.Sprintf("%s", values[0])
   107  			}
   108  			if raw, ok := values[1].([]byte); ok {
   109  				warning.Code = string(raw)
   110  			} else {
   111  				warning.Code = fmt.Sprintf("%s", values[1])
   112  			}
   113  			if raw, ok := values[2].([]byte); ok {
   114  				warning.Message = string(raw)
   115  			} else {
   116  				warning.Message = fmt.Sprintf("%s", values[0])
   117  			}
   118  
   119  			warnings = append(warnings, warning)
   120  
   121  		case io.EOF:
   122  			return warnings
   123  
   124  		default:
   125  			rows.Close()
   126  			return
   127  		}
   128  	}
   129  }