xugusql_fields.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*PACK NAME*/
  2. package xugusql
  3. import (
  4. "database/sql"
  5. "reflect"
  6. "time"
  7. )
  8. type NullTime struct {
  9. Time time.Time
  10. Valid bool // Valid is true if Time is not NULL
  11. }
  12. type xugusqlField struct {
  13. tableName string
  14. /*
  15. * Store the name of the column
  16. * name of the current field
  17. * */
  18. name string
  19. length int
  20. /*
  21. * Store the data type information
  22. * of the current field column
  23. * */
  24. fieldType fieldType
  25. }
  26. type fieldType byte
  27. const (
  28. fieldTypeBool fieldType = iota + 0x01
  29. fieldTypeChar
  30. fieldTypeTinyint
  31. fieldTypeShort
  32. fieldTypeInteger
  33. fieldTypeBigint
  34. fieldTypeFloat
  35. fieldTypeDouble
  36. fieldTypeNumeric
  37. fieldTypeDate
  38. fieldTypeTime
  39. fieldTypeTimeTZ
  40. fieldTypeDatetime fieldType = 23
  41. fieldTypeDatetimeTZ fieldType = 14
  42. fieldTypeBinary fieldType = 15
  43. fieldTypeInterval fieldType = 21
  44. fieldTypeIntervalY2M fieldType = 28
  45. fieldTypeIntervalD2S fieldType = 31
  46. fieldTypeLob fieldType = 40
  47. fieldTypeClob fieldType = 41
  48. fieldTypeBlob fieldType = 42
  49. )
  50. /* {{ */
  51. func (self *xugusqlField) typeDatabaseName() string {
  52. switch self.fieldType {
  53. case fieldTypeBool:
  54. return "BOOLEAN"
  55. case fieldTypeChar:
  56. return "CHAR"
  57. case fieldTypeTinyint:
  58. return "TINYINT"
  59. case fieldTypeShort:
  60. return "SHORT"
  61. case fieldTypeInteger:
  62. return "INTEGER"
  63. case fieldTypeBigint:
  64. return "BIGINT"
  65. case fieldTypeFloat:
  66. return "FLOAT"
  67. case fieldTypeDouble:
  68. return "DOUBLE"
  69. case fieldTypeNumeric:
  70. return "NUMERIC"
  71. case fieldTypeDate:
  72. return "DATE"
  73. case fieldTypeTime:
  74. return "TIME"
  75. case fieldTypeTimeTZ:
  76. return "TIMEZONE"
  77. case fieldTypeDatetime:
  78. return "DATETIME"
  79. case fieldTypeDatetimeTZ:
  80. return "DATETIME TIMEZONE"
  81. case fieldTypeBinary:
  82. return "BINARY"
  83. case fieldTypeInterval:
  84. return "INTERVAL"
  85. case fieldTypeIntervalY2M:
  86. return "INTERVAL YEAR TO MONTH"
  87. case fieldTypeIntervalD2S:
  88. return "INTERVAL DAY TO SECOND"
  89. case fieldTypeClob:
  90. return "CLOB"
  91. case fieldTypeBlob:
  92. return "BLOB"
  93. default:
  94. return ""
  95. }
  96. }
  97. /* {{ */
  98. func (self *xugusqlField) scanType() reflect.Type {
  99. switch self.fieldType {
  100. case fieldTypeBool:
  101. return scanTypeBool
  102. case fieldTypeTinyint:
  103. return scanTypeInt8
  104. case fieldTypeShort:
  105. return scanTypeInt16
  106. case fieldTypeInteger:
  107. return scanTypeInt32
  108. case fieldTypeBigint:
  109. return scanTypeInt64
  110. case fieldTypeFloat:
  111. return scanTypeFloat32
  112. case fieldTypeDouble:
  113. return scanTypeFloat64
  114. case fieldTypeDate,
  115. fieldTypeTime,
  116. fieldTypeDatetime:
  117. return scanTypeNullTime
  118. case fieldTypeTimeTZ,
  119. fieldTypeDatetimeTZ,
  120. fieldTypeChar,
  121. fieldTypeBinary,
  122. fieldTypeInterval,
  123. fieldTypeNumeric,
  124. fieldTypeIntervalY2M,
  125. fieldTypeIntervalD2S,
  126. fieldTypeLob,
  127. fieldTypeClob,
  128. fieldTypeBlob:
  129. return scanTypeRawBytes
  130. default:
  131. return scanTypeUnknown
  132. }
  133. }
  134. var (
  135. scanTypeFloat32 = reflect.TypeOf(float32(0))
  136. scanTypeFloat64 = reflect.TypeOf(float64(0))
  137. scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
  138. scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
  139. scanTypeNullTime = reflect.TypeOf(time.Time{})
  140. scanTypeInt8 = reflect.TypeOf(int8(0))
  141. scanTypeInt16 = reflect.TypeOf(int16(0))
  142. scanTypeInt32 = reflect.TypeOf(int32(0))
  143. scanTypeInt64 = reflect.TypeOf(int64(0))
  144. scanTypeUnknown = reflect.TypeOf(new(interface{}))
  145. scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
  146. scanTypeUint8 = reflect.TypeOf(uint8(0))
  147. scanTypeUint16 = reflect.TypeOf(uint16(0))
  148. scanTypeUint32 = reflect.TypeOf(uint32(0))
  149. scanTypeUint64 = reflect.TypeOf(uint64(0))
  150. scanTypeBool = reflect.TypeOf(bool(false))
  151. )