xugu_fields.go 4.9 KB

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