123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /*PACK NAME*/
- package xugusql
- import (
- "database/sql"
- "reflect"
- "time"
- )
- type NullTime struct {
- Time time.Time
- Valid bool // Valid is true if Time is not NULL
- }
- type xugusqlField struct {
- tableName string
- /*
- * Store the name of the column
- * name of the current field
- * */
- name string
- length int
- /*
- * Store the data type information
- * of the current field column
- * */
- fieldType fieldType
- }
- type fieldType byte
- const (
- fieldTypeBool fieldType = iota + 0x01
- fieldTypeChar
- fieldTypeTinyint
- fieldTypeShort
- fieldTypeInteger
- fieldTypeBigint
- fieldTypeFloat
- fieldTypeDouble
- fieldTypeNumeric
- fieldTypeDate
- fieldTypeTime
- fieldTypeTimeTZ
- fieldTypeDatetime fieldType = 23
- fieldTypeDatetimeTZ fieldType = 14
- fieldTypeBinary fieldType = 15
- fieldTypeInterval fieldType = 21
- fieldTypeIntervalY2M fieldType = 28
- fieldTypeIntervalD2S fieldType = 31
- fieldTypeLob fieldType = 40
- fieldTypeClob fieldType = 41
- fieldTypeBlob fieldType = 42
- )
- /* {{ */
- func (self *xugusqlField) typeDatabaseName() string {
- switch self.fieldType {
- case fieldTypeBool:
- return "BOOLEAN"
- case fieldTypeChar:
- return "CHAR"
- case fieldTypeTinyint:
- return "TINYINT"
- case fieldTypeShort:
- return "SHORT"
- case fieldTypeInteger:
- return "INTEGER"
- case fieldTypeBigint:
- return "BIGINT"
- case fieldTypeFloat:
- return "FLOAT"
- case fieldTypeDouble:
- return "DOUBLE"
- case fieldTypeNumeric:
- return "NUMERIC"
- case fieldTypeDate:
- return "DATE"
- case fieldTypeTime:
- return "TIME"
- case fieldTypeTimeTZ:
- return "TIMEZONE"
- case fieldTypeDatetime:
- return "DATETIME"
- case fieldTypeDatetimeTZ:
- return "DATETIME TIMEZONE"
- case fieldTypeBinary:
- return "BINARY"
- case fieldTypeInterval:
- return "INTERVAL"
- case fieldTypeIntervalY2M:
- return "INTERVAL YEAR TO MONTH"
- case fieldTypeIntervalD2S:
- return "INTERVAL DAY TO SECOND"
- case fieldTypeClob:
- return "CLOB"
- case fieldTypeBlob:
- return "BLOB"
- default:
- return ""
- }
- }
- /* {{ */
- func (self *xugusqlField) scanType() reflect.Type {
- switch self.fieldType {
- case fieldTypeBool:
- return scanTypeBool
- case fieldTypeTinyint:
- return scanTypeInt8
- case fieldTypeShort:
- return scanTypeInt16
- case fieldTypeInteger:
- return scanTypeInt32
- case fieldTypeBigint:
- return scanTypeInt64
- case fieldTypeFloat:
- return scanTypeFloat32
- case fieldTypeDouble:
- return scanTypeFloat64
- case fieldTypeDate,
- fieldTypeTime,
- fieldTypeDatetime:
- return scanTypeNullTime
- case fieldTypeTimeTZ,
- fieldTypeDatetimeTZ,
- fieldTypeChar,
- fieldTypeBinary,
- fieldTypeInterval,
- fieldTypeNumeric,
- fieldTypeIntervalY2M,
- fieldTypeIntervalD2S,
- fieldTypeLob,
- fieldTypeClob,
- fieldTypeBlob:
- return scanTypeRawBytes
- default:
- return scanTypeUnknown
- }
- }
- var (
- scanTypeFloat32 = reflect.TypeOf(float32(0))
- scanTypeFloat64 = reflect.TypeOf(float64(0))
- scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
- scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
- scanTypeNullTime = reflect.TypeOf(time.Time{})
- scanTypeInt8 = reflect.TypeOf(int8(0))
- scanTypeInt16 = reflect.TypeOf(int16(0))
- scanTypeInt32 = reflect.TypeOf(int32(0))
- scanTypeInt64 = reflect.TypeOf(int64(0))
- scanTypeUnknown = reflect.TypeOf(new(interface{}))
- scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
- scanTypeUint8 = reflect.TypeOf(uint8(0))
- scanTypeUint16 = reflect.TypeOf(uint16(0))
- scanTypeUint32 = reflect.TypeOf(uint32(0))
- scanTypeUint64 = reflect.TypeOf(uint64(0))
- scanTypeBool = reflect.TypeOf(bool(false))
- )
|