package native

import "strconv"

// Client caps - borrowed from GoMySQL
const (
	_CLIENT_LONG_PASSWORD                  = 1 << iota // new more secure passwords
	_CLIENT_FOUND_ROWS                                 // Found instead of affected rows
	_CLIENT_LONG_FLAG                                  // Get all column flags
	_CLIENT_CONNECT_WITH_DB                            // One can specify db on connect
	_CLIENT_NO_SCHEMA                                  // Don't allow database.table.column
	_CLIENT_COMPRESS                                   // Can use compression protocol
	_CLIENT_ODBC                                       // Odbc client
	_CLIENT_LOCAL_FILES                                // Can use LOAD DATA LOCAL
	_CLIENT_IGNORE_SPACE                               // Ignore spaces before '('
	_CLIENT_PROTOCOL_41                                // New 4.1 protocol
	_CLIENT_INTERACTIVE                                // This is an interactive client
	_CLIENT_SSL                                        // Switch to SSL after handshake
	_CLIENT_IGNORE_SIGPIPE                             // IGNORE sigpipes
	_CLIENT_TRANSACTIONS                               // Client knows about transactions
	_CLIENT_RESERVED                                   // Old flag for 4.1 protocol
	_CLIENT_SECURE_CONN                                // New 4.1 authentication
	_CLIENT_MULTI_STATEMENTS                           // Enable/disable multi-stmt support
	_CLIENT_MULTI_RESULTS                              // Enable/disable multi-results
	_CLIENT_PS_MULTI_RESULTS                           // Enable/disable multiple resultsets for COM_STMT_EXECUTE
	_CLIENT_PLUGIN_AUTH                                // Supports authentication plugins
	_CLIENT_CONNECT_ATTRS                              // Sends connection attributes in Protocol::HandshakeResponse41
	_CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA             // Length of auth response data in Protocol::HandshakeResponse41 is a length-encoded integer
	_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS               // Enable/disable expired passwords
	_CLIENT_SESSION_TRACK                              // Can set SERVER_SESSION_STATE_CHANGED in the Status Flags and send session-state change data after a OK packet.
	_CLIENT_DEPRECATE_EOF                              // Expects an OK (instead of EOF) after the resultset rows of a Text Resultset
)

// Commands - borrowed from GoMySQL
const (
	_COM_QUIT                = 0x01
	_COM_INIT_DB             = 0x02
	_COM_QUERY               = 0x03
	_COM_FIELD_LIST          = 0x04
	_COM_CREATE_DB           = 0x05
	_COM_DROP_DB             = 0x06
	_COM_REFRESH             = 0x07
	_COM_SHUTDOWN            = 0x08
	_COM_STATISTICS          = 0x09
	_COM_PROCESS_INFO        = 0x0a
	_COM_CONNECT             = 0x0b
	_COM_PROCESS_KILL        = 0x0c
	_COM_DEBUG               = 0x0d
	_COM_PING                = 0x0e
	_COM_TIME                = 0x0f
	_COM_DELAYED_INSERT      = 0x10
	_COM_CHANGE_USER         = 0x11
	_COM_BINLOG_DUMP         = 0x12
	_COM_TABLE_DUMP          = 0x13
	_COM_CONNECT_OUT         = 0x14
	_COM_REGISTER_SLAVE      = 0x15
	_COM_STMT_PREPARE        = 0x16
	_COM_STMT_EXECUTE        = 0x17
	_COM_STMT_SEND_LONG_DATA = 0x18
	_COM_STMT_CLOSE          = 0x19
	_COM_STMT_RESET          = 0x1a
	_COM_SET_OPTION          = 0x1b
	_COM_STMT_FETCH          = 0x1c
)

// MySQL protocol types.
//
// mymysql uses only some of them for send data to the MySQL server. Used
// MySQL types are marked with a comment contains mymysql type that uses it.
const (
	MYSQL_TYPE_DECIMAL     = 0x00
	MYSQL_TYPE_TINY        = 0x01 // int8, uint8, bool
	MYSQL_TYPE_SHORT       = 0x02 // int16, uint16
	MYSQL_TYPE_LONG        = 0x03 // int32, uint32
	MYSQL_TYPE_FLOAT       = 0x04 // float32
	MYSQL_TYPE_DOUBLE      = 0x05 // float64
	MYSQL_TYPE_NULL        = 0x06 // nil
	MYSQL_TYPE_TIMESTAMP   = 0x07 // Timestamp
	MYSQL_TYPE_LONGLONG    = 0x08 // int64, uint64
	MYSQL_TYPE_INT24       = 0x09
	MYSQL_TYPE_DATE        = 0x0a // Date
	MYSQL_TYPE_TIME        = 0x0b // Time
	MYSQL_TYPE_DATETIME    = 0x0c // time.Time
	MYSQL_TYPE_YEAR        = 0x0d
	MYSQL_TYPE_NEWDATE     = 0x0e
	MYSQL_TYPE_VARCHAR     = 0x0f
	MYSQL_TYPE_BIT         = 0x10
	MYSQL_TYPE_NEWDECIMAL  = 0xf6
	MYSQL_TYPE_ENUM        = 0xf7
	MYSQL_TYPE_SET         = 0xf8
	MYSQL_TYPE_TINY_BLOB   = 0xf9
	MYSQL_TYPE_MEDIUM_BLOB = 0xfa
	MYSQL_TYPE_LONG_BLOB   = 0xfb
	MYSQL_TYPE_BLOB        = 0xfc // Blob
	MYSQL_TYPE_VAR_STRING  = 0xfd // []byte
	MYSQL_TYPE_STRING      = 0xfe // string
	MYSQL_TYPE_GEOMETRY    = 0xff

	MYSQL_UNSIGNED_MASK = uint16(1 << 15)
)

// Mapping of MySQL types to (prefered) protocol types. Use it if you create
// your own Raw value.
//
// Comments contains corresponding types used by mymysql. string type may be
// replaced by []byte type and vice versa. []byte type is native for sending
// on a network, so any string is converted to it before sending. Than for
// better performance use []byte.
const (
	// Client send and receive, mymysql representation for send / receive
	TINYINT   = MYSQL_TYPE_TINY      // int8 / int8
	SMALLINT  = MYSQL_TYPE_SHORT     // int16 / int16
	INT       = MYSQL_TYPE_LONG      // int32 / int32
	BIGINT    = MYSQL_TYPE_LONGLONG  // int64 / int64
	FLOAT     = MYSQL_TYPE_FLOAT     // float32 / float32
	DOUBLE    = MYSQL_TYPE_DOUBLE    // float64 / float32
	TIME      = MYSQL_TYPE_TIME      // Time / Time
	DATE      = MYSQL_TYPE_DATE      // Date / Date
	DATETIME  = MYSQL_TYPE_DATETIME  // time.Time / time.Time
	TIMESTAMP = MYSQL_TYPE_TIMESTAMP // Timestamp / time.Time
	CHAR      = MYSQL_TYPE_STRING    // string / []byte
	BLOB      = MYSQL_TYPE_BLOB      // Blob / []byte
	NULL      = MYSQL_TYPE_NULL      // nil

	// Client send only, mymysql representation for send
	OUT_TEXT      = MYSQL_TYPE_STRING // string
	OUT_VARCHAR   = MYSQL_TYPE_STRING // string
	OUT_BINARY    = MYSQL_TYPE_BLOB   // Blob
	OUT_VARBINARY = MYSQL_TYPE_BLOB   // Blob

	// Client receive only, mymysql representation for receive
	IN_MEDIUMINT  = MYSQL_TYPE_LONG        // int32
	IN_YEAR       = MYSQL_TYPE_SHORT       // int16
	IN_BINARY     = MYSQL_TYPE_STRING      // []byte
	IN_VARCHAR    = MYSQL_TYPE_VAR_STRING  // []byte
	IN_VARBINARY  = MYSQL_TYPE_VAR_STRING  // []byte
	IN_TINYBLOB   = MYSQL_TYPE_TINY_BLOB   // []byte
	IN_TINYTEXT   = MYSQL_TYPE_TINY_BLOB   // []byte
	IN_TEXT       = MYSQL_TYPE_BLOB        // []byte
	IN_MEDIUMBLOB = MYSQL_TYPE_MEDIUM_BLOB // []byte
	IN_MEDIUMTEXT = MYSQL_TYPE_MEDIUM_BLOB // []byte
	IN_LONGBLOB   = MYSQL_TYPE_LONG_BLOB   // []byte
	IN_LONGTEXT   = MYSQL_TYPE_LONG_BLOB   // []byte

	// MySQL 5.x specific
	IN_DECIMAL = MYSQL_TYPE_NEWDECIMAL // TODO
	IN_BIT     = MYSQL_TYPE_BIT        // []byte
)

// Flags - borrowed from GoMySQL
const (
	_FLAG_NOT_NULL = 1 << iota
	_FLAG_PRI_KEY
	_FLAG_UNIQUE_KEY
	_FLAG_MULTIPLE_KEY
	_FLAG_BLOB
	_FLAG_UNSIGNED
	_FLAG_ZEROFILL
	_FLAG_BINARY
	_FLAG_ENUM
	_FLAG_AUTO_INCREMENT
	_FLAG_TIMESTAMP
	_FLAG_SET
	_FLAG_NO_DEFAULT_VALUE
)

var (
	_SIZE_OF_INT int
	_INT_TYPE    uint16
)

func init() {
	switch strconv.IntSize {
	case 32:
		_INT_TYPE = MYSQL_TYPE_LONG
		_SIZE_OF_INT = 4
	case 64:
		_INT_TYPE = MYSQL_TYPE_LONGLONG
		_SIZE_OF_INT = 8
	default:
		panic("bad int size")
	}
}
