123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- package xugu
- 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
- }
- const (
- TYPE_EMPTY = 0
- TYPE_NULL = 1
- TYPE_BOOL = 2
- TYPE_I1 = 3
- TYPE_I2 = 4
- TYPE_I4 = 5
- TYPE_I8 = 6
- TYPE_NUM = 7
- TYPE_R4 = 8
- TYPE_R8 = 9
- TYPE_DATE = 10
- TYPE_TIME = 11
- TYPE_TIME_TZ = 12
- TYPE_DATETIME = 13
- TYPE_DATETIME_TZ = 14
- TYPE_INTERVAL_Y = 15
- TYPE_INTERVAL_Y2M = 16
- TYPE_INTERVAL_M = 17
- TYPE_INTERVAL_D = 18
- TYPE_INTERVAL_D2H = 19
- TYPE_INTERVAL_H = 20
- TYPE_INTERVAL_D2M = 21
- TYPE_INTERVAL_H2M = 22
- TYPE_INTERVAL_MI = 23
- TYPE_INTERVAL_D2S = 24
- TYPE_INTERVAL_H2S = 25
- TYPE_INTERVAL_M2S = 26
- TYPE_INTERVAL_S = 27
- TYPE_ROWVER = 28
- TYPE_GUID = 29
- TYPE_CHAR = 30
- TYPE_NCHAR = 31
- TYPE_CLOB = 32
- TYPE_BINARY = 33
- TYPE_BLOB = 34
- TYPE_GEOM = 35
- TYPE_POINT = 36
- TYPE_BOX = 37
- TYPE_POLYLINE = 38
- TYPE_POLYGON = 39
- TYPE_BLOB_I = 40
- TYPE_BLOB_S = 41
- TYPE_BLOB_M = 42
- TYPE_BLOB_OM = 43
- TYPE_STREAM = 44
- TYPE_ROWID = 45
- TYPE_SIBLING = 46
- TYPE_MAX_SYS = 47
- TYPE_BLADE_BEGIN = 101
- TYPE_BLADE_END = 1000
- TYPE_OBJECT = 1001
- TYPE_REFROW = 1002
- TYPE_RECORD = 1003
- TYPE_VARRAY = 1004
- TYPE_TABLE = 1005
- TYPE_ITABLE = 1006
- TYPE_CURSOR = 1007
- TYPE_REFCUR = 1008
- TYPE_ROWTYPE = 1009
- TYPE_COLTYPE = 1010
- TYPE_CUR_REC = 1011
- TYPE_PARAM = 1012
- )
- const (
- XG_C_NULL = 0
- XG_C_BOOL = 1
- XG_C_CHAR = 2
- XG_C_TINYINT = 3
- XG_C_SHORT = 4
- XG_C_INTEGER = 5
- XG_C_BIGINT = 6
- XG_C_FLOAT = 7
- XG_C_DOUBLE = 8
- XG_C_NUMERIC = 9
- XG_C_DATE = 10
- XG_C_TIME = 11
- XG_C_TIME_TZ = 12
- XG_C_DATETIME = 13
- XG_C_DATETIME_TZ = 14
- XG_C_BINARY = 15
- XG_C_INTERVAL = 21
- XG_C_INTERVAL_YEAR_TO_MONTH = 28
- XG_C_INTERVAL_DAY_TO_SECOND = 31
- XG_C_CLOB = 41
- XG_C_BLOB = 42
- )
- 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 getSQLCType(typeID uint32) int32 {
- switch typeID {
- case TYPE_BOOL:
- return XG_C_BOOL
- case TYPE_I1:
- return XG_C_TINYINT
- case TYPE_I2:
- return XG_C_SHORT
- case TYPE_I4:
- return XG_C_INTEGER
- case TYPE_I8:
- return XG_C_BIGINT
- case TYPE_R4:
- return XG_C_FLOAT
- case TYPE_R8:
- return XG_C_DOUBLE
- case TYPE_NUM:
- return XG_C_NUMERIC
- case TYPE_DATETIME:
- return XG_C_DATETIME
- case TYPE_DATETIME_TZ:
- return XG_C_DATETIME_TZ
- case TYPE_INTERVAL_Y2M:
- return XG_C_INTERVAL_YEAR_TO_MONTH
- case TYPE_INTERVAL_D2S:
- return XG_C_INTERVAL_DAY_TO_SECOND
- case TYPE_GUID:
- return TYPE_GUID + 40
- case TYPE_TIME_TZ:
- return XG_C_TIME_TZ
- case TYPE_DATE:
- return XG_C_DATE
- case TYPE_TIME:
- return XG_C_TIME
- case TYPE_BINARY:
- return XG_C_BINARY
- case TYPE_CLOB:
- return XG_C_CLOB
- case TYPE_BLOB:
- return XG_C_BLOB
- case TYPE_INTERVAL_Y, TYPE_INTERVAL_M, TYPE_INTERVAL_D, TYPE_INTERVAL_H,
- TYPE_INTERVAL_MI, TYPE_INTERVAL_S, TYPE_INTERVAL_D2H, TYPE_INTERVAL_D2M,
- TYPE_INTERVAL_H2M, TYPE_INTERVAL_H2S, TYPE_INTERVAL_M2S:
- return XG_C_INTERVAL
- default:
- return XG_C_CHAR
- }
- }
- /* {{ */
- 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))
- )
|