package util

import (
	"time"

	"github.com/go-sql-driver/mysql"
)

func NewDefaultMysqlConfig() *mysql.Config {
	cf := mysql.NewConfig()

	cf.Net = "tcp"
	cf.Addr = "127.0.0.1:3306"
	cf.ReadTimeout = time.Second * 30
	cf.WriteTimeout = time.Second * 30
	cf.ParseTime = true

	cf.Params = map[string]string{
		"charset": "utf8mb4",
	}

	return cf
}

// Escape implements SQL escaping.
func Escape(sql string) string {
	dest := make([]byte, 0, 2*len(sql))
	var escape byte
	for i := 0; i < len(sql); i++ {
		c := sql[i]

		escape = 0

		switch c {
		case 0: /* Must be escaped for 'mysql' */
			escape = '0'
		case '\n': /* Must be escaped for logs */
			escape = 'n'
		case '\r':
			escape = 'r'
		case '\\':
			escape = '\\'
		case '\'':
			escape = '\''
		case '"': /* Better safe than sorry */
			escape = '"'
		case '\032': /* This gives problems on Win32 */
			escape = 'Z'
		}

		if escape != 0 {
			dest = append(dest, '\\', escape)
		} else {
			dest = append(dest, c)
		}
	}

	return string(dest)
}
