177 lines
6.0 KiB
Go
177 lines
6.0 KiB
Go
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
|
|
)
|
|
|
|
// 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 preformance 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")
|
|
}
|
|
}
|