xugu_fields.go 4.6 KB

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