xugu_fields.go 5.5 KB

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