xugu_fields.go 4.9 KB

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