xugu_fields.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package xugu
  2. import (
  3. "database/sql"
  4. "reflect"
  5. "time"
  6. )
  7. type xuguField struct {
  8. tableName string
  9. /*
  10. * Store the name of the column
  11. * name of the current field
  12. * */
  13. name string
  14. length int
  15. /*
  16. * Store the data type information
  17. * of the current field column
  18. * */
  19. fieldType fieldType
  20. }
  21. type fieldType uint16
  22. // const (
  23. // fieldTypeBool fieldType = iota + 0x01
  24. // fieldTypeChar
  25. // fieldTypeTinyint
  26. // fieldTypeShort
  27. // fieldTypeInteger
  28. // fieldTypeBigint
  29. // fieldTypeFloat
  30. // fieldTypeDouble
  31. // fieldTypeNumeric
  32. // fieldTypeDate
  33. // fieldTypeTime
  34. // fieldTypeTimeTZ
  35. // fieldTypeDatetime fieldType = 23
  36. // fieldTypeDatetimeTZ fieldType = 14
  37. // fieldTypeBinary fieldType = 15
  38. // fieldTypeVarChar fieldType = 30
  39. // fieldTypeInterval fieldType = 21
  40. // fieldTypeIntervalY2M fieldType = 28
  41. // fieldTypeIntervalD2S fieldType = 31
  42. // fieldTypeLob fieldType = 40
  43. // fieldTypeClob fieldType = 41
  44. // fieldTypeBlob fieldType = 42
  45. // )
  46. const (
  47. fieldType_EMPTY fieldType = iota + 0x00
  48. fieldType_NULL
  49. fieldType_BOOL
  50. fieldType_I1
  51. fieldType_I2
  52. fieldType_I4
  53. fieldType_I8
  54. fieldType_NUM
  55. fieldType_R4
  56. fieldType_R8
  57. fieldType_DATE
  58. fieldType_TIME
  59. fieldType_TIME_TZ
  60. fieldType_DATETIME
  61. fieldType_DATETIME_TZ
  62. fieldType_INTERVAL_Y
  63. fieldType_INTERVAL_Y2M
  64. fieldType_INTERVAL_M
  65. fieldType_INTERVAL_D
  66. fieldType_INTERVAL_D2H
  67. fieldType_INTERVAL_H
  68. fieldType_INTERVAL_D2M
  69. fieldType_INTERVAL_H2M
  70. fieldType_INTERVAL_MI
  71. fieldType_INTERVAL_D2S
  72. fieldType_INTERVAL_H2S
  73. fieldType_INTERVAL_M2S
  74. fieldType_INTERVAL_S
  75. fieldType_ROWVER
  76. fieldType_GUID
  77. fieldType_CHAR
  78. fieldType_NCHAR
  79. fieldType_CLOB
  80. fieldType_BINARY
  81. fieldType_BLOB
  82. fieldType_GEOM
  83. fieldType_POINT
  84. fieldType_BOX
  85. fieldType_POLYLINE
  86. fieldType_POLYGON
  87. fieldType_BLOB_I
  88. fieldType_BLOB_S
  89. fieldType_BLOB_M
  90. fieldType_BLOB_OM
  91. fieldType_STREAM
  92. fieldType_ROWID
  93. fieldType_SIBLING
  94. fieldType_MAX_SYS fieldType = 47
  95. fieldType_BLADE_BEGIN fieldType = 101
  96. fieldType_BLADE_END fieldType = 1000
  97. fieldType_OBJECT fieldType = 1001 // object type
  98. fieldType_REFROW
  99. fieldType_RECORD // record type
  100. fieldType_VARRAY // array type
  101. fieldType_TABLE // table type
  102. fieldType_ITABLE // Idxby table
  103. fieldType_CURSOR // involved ref-record type (cannot change)
  104. fieldType_REFCUR // REF_CURSOR type
  105. fieldType_ROWTYPE // ref row type
  106. fieldType_COLTYPE // ref column type
  107. fieldType_CUR_REC
  108. fieldType_PARAM
  109. )
  110. /* {{ */
  111. func (self *FieldDescri) typeDatabaseName() string {
  112. switch self.FieldType {
  113. case fieldType_BOOL:
  114. return "BOOLEAN"
  115. case fieldType_CHAR, fieldType_NCHAR:
  116. return "CHAR"
  117. case fieldType_I1:
  118. return "TINYINT"
  119. case fieldType_I2:
  120. return "SHORT"
  121. case fieldType_I4:
  122. return "INTEGER"
  123. case fieldType_I8:
  124. return "BIGINT"
  125. case fieldType_R4:
  126. return "FLOAT"
  127. case fieldType_R8:
  128. return "DOUBLE"
  129. case fieldType_NUM:
  130. return "NUMERIC"
  131. case fieldType_DATE:
  132. return "DATE"
  133. case fieldType_TIME:
  134. return "TIME"
  135. case fieldType_TIME_TZ:
  136. return "TIMEZONE"
  137. case fieldType_DATETIME:
  138. return "DATETIME"
  139. case fieldType_DATETIME_TZ:
  140. return "DATETIME TIMEZONE"
  141. case fieldType_BINARY:
  142. return "BINARY"
  143. case fieldType_INTERVAL_Y:
  144. return "INTERVAL YEAR"
  145. case fieldType_INTERVAL_Y2M:
  146. return "INTERVAL YEAR TO MONTH"
  147. case fieldType_INTERVAL_D2S:
  148. return "INTERVAL DAY TO SECOND"
  149. case fieldType_CLOB:
  150. return "CLOB"
  151. case fieldType_BLOB:
  152. return "BLOB"
  153. default:
  154. return ""
  155. }
  156. }
  157. /* {{ */
  158. func (self *FieldDescri) scanType() reflect.Type {
  159. switch self.FieldType {
  160. case fieldType_BOOL:
  161. return scanTypeBool
  162. case fieldType_I1:
  163. return scanTypeInt8
  164. case fieldType_I2:
  165. return scanTypeInt16
  166. case fieldType_I4:
  167. return scanTypeInt32
  168. case fieldType_I8:
  169. return scanTypeInt64
  170. case fieldType_R4:
  171. return scanTypeFloat32
  172. case fieldType_R8:
  173. return scanTypeFloat64
  174. case fieldType_DATE,
  175. fieldType_TIME,
  176. fieldType_DATETIME:
  177. return scanTypeNullTime
  178. case fieldType_TIME_TZ,
  179. fieldType_DATETIME_TZ,
  180. fieldType_CHAR,
  181. fieldType_NCHAR,
  182. fieldType_BINARY,
  183. //fieldTypeInterval,
  184. fieldType_NUM,
  185. fieldType_INTERVAL_Y2M,
  186. fieldType_INTERVAL_D2S,
  187. //fieldTypeLob,
  188. fieldType_CLOB,
  189. fieldType_BLOB:
  190. return scanTypeRawBytes
  191. default:
  192. return scanTypeUnknown
  193. }
  194. }
  195. var (
  196. scanTypeFloat32 = reflect.TypeOf(float32(0))
  197. scanTypeFloat64 = reflect.TypeOf(float64(0))
  198. scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
  199. scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
  200. scanTypeNullTime = reflect.TypeOf(time.Time{})
  201. scanTypeInt8 = reflect.TypeOf(int8(0))
  202. scanTypeInt16 = reflect.TypeOf(int16(0))
  203. scanTypeInt32 = reflect.TypeOf(int32(0))
  204. scanTypeInt64 = reflect.TypeOf(int64(0))
  205. scanTypeUnknown = reflect.TypeOf(new(interface{}))
  206. scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
  207. scanTypeUint8 = reflect.TypeOf(uint8(0))
  208. scanTypeUint16 = reflect.TypeOf(uint16(0))
  209. scanTypeUint32 = reflect.TypeOf(uint32(0))
  210. scanTypeUint64 = reflect.TypeOf(uint64(0))
  211. scanTypeBool = reflect.TypeOf(bool(false))
  212. )