xugusql_fields.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package xugu
  2. import (
  3. "database/sql"
  4. "reflect"
  5. "time"
  6. )
  7. type NullTime struct {
  8. Time time.Time
  9. Valid bool // Valid is true if Time is not NULL
  10. }
  11. type xugusqlField struct {
  12. tableName string
  13. /*
  14. * Store the name of the column
  15. * name of the current field
  16. * */
  17. name string
  18. length int
  19. /*
  20. * Store the data type information
  21. * of the current field column
  22. * */
  23. fieldType fieldType
  24. }
  25. const (
  26. TYPE_EMPTY = 0
  27. TYPE_NULL = 1
  28. TYPE_BOOL = 2
  29. TYPE_I1 = 3
  30. TYPE_I2 = 4
  31. TYPE_I4 = 5
  32. TYPE_I8 = 6
  33. TYPE_NUM = 7
  34. TYPE_R4 = 8
  35. TYPE_R8 = 9
  36. TYPE_DATE = 10
  37. TYPE_TIME = 11
  38. TYPE_TIME_TZ = 12
  39. TYPE_DATETIME = 13
  40. TYPE_DATETIME_TZ = 14
  41. TYPE_INTERVAL_Y = 15
  42. TYPE_INTERVAL_Y2M = 16
  43. TYPE_INTERVAL_M = 17
  44. TYPE_INTERVAL_D = 18
  45. TYPE_INTERVAL_D2H = 19
  46. TYPE_INTERVAL_H = 20
  47. TYPE_INTERVAL_D2M = 21
  48. TYPE_INTERVAL_H2M = 22
  49. TYPE_INTERVAL_MI = 23
  50. TYPE_INTERVAL_D2S = 24
  51. TYPE_INTERVAL_H2S = 25
  52. TYPE_INTERVAL_M2S = 26
  53. TYPE_INTERVAL_S = 27
  54. TYPE_ROWVER = 28
  55. TYPE_GUID = 29
  56. TYPE_CHAR = 30
  57. TYPE_NCHAR = 31
  58. TYPE_CLOB = 32
  59. TYPE_BINARY = 33
  60. TYPE_BLOB = 34
  61. TYPE_GEOM = 35
  62. TYPE_POINT = 36
  63. TYPE_BOX = 37
  64. TYPE_POLYLINE = 38
  65. TYPE_POLYGON = 39
  66. TYPE_BLOB_I = 40
  67. TYPE_BLOB_S = 41
  68. TYPE_BLOB_M = 42
  69. TYPE_BLOB_OM = 43
  70. TYPE_STREAM = 44
  71. TYPE_ROWID = 45
  72. TYPE_SIBLING = 46
  73. TYPE_MAX_SYS = 47
  74. TYPE_BLADE_BEGIN = 101
  75. TYPE_BLADE_END = 1000
  76. TYPE_OBJECT = 1001
  77. TYPE_REFROW = 1002
  78. TYPE_RECORD = 1003
  79. TYPE_VARRAY = 1004
  80. TYPE_TABLE = 1005
  81. TYPE_ITABLE = 1006
  82. TYPE_CURSOR = 1007
  83. TYPE_REFCUR = 1008
  84. TYPE_ROWTYPE = 1009
  85. TYPE_COLTYPE = 1010
  86. TYPE_CUR_REC = 1011
  87. TYPE_PARAM = 1012
  88. )
  89. const (
  90. XG_C_NULL = 0
  91. XG_C_BOOL = 1
  92. XG_C_CHAR = 2
  93. XG_C_TINYINT = 3
  94. XG_C_SHORT = 4
  95. XG_C_INTEGER = 5
  96. XG_C_BIGINT = 6
  97. XG_C_FLOAT = 7
  98. XG_C_DOUBLE = 8
  99. XG_C_NUMERIC = 9
  100. XG_C_DATE = 10
  101. XG_C_TIME = 11
  102. XG_C_TIME_TZ = 12
  103. XG_C_DATETIME = 13
  104. XG_C_DATETIME_TZ = 14
  105. XG_C_BINARY = 15
  106. XG_C_INTERVAL = 21
  107. XG_C_INTERVAL_YEAR_TO_MONTH = 28
  108. XG_C_INTERVAL_DAY_TO_SECOND = 31
  109. XG_C_CLOB = 41
  110. XG_C_BLOB = 42
  111. )
  112. type fieldType byte
  113. const (
  114. fieldTypeBool fieldType = iota + 0x01
  115. fieldTypeChar
  116. fieldTypeTinyint
  117. fieldTypeShort
  118. fieldTypeInteger
  119. fieldTypeBigint
  120. fieldTypeFloat
  121. fieldTypeDouble
  122. fieldTypeNumeric
  123. fieldTypeDate
  124. fieldTypeTime
  125. fieldTypeTimeTZ
  126. fieldTypeDatetime fieldType = 23
  127. fieldTypeDatetimeTZ fieldType = 14
  128. fieldTypeBinary fieldType = 15
  129. fieldTypeInterval fieldType = 21
  130. fieldTypeIntervalY2M fieldType = 28
  131. fieldTypeIntervalD2S fieldType = 31
  132. fieldTypeLob fieldType = 40
  133. fieldTypeClob fieldType = 41
  134. fieldTypeBlob fieldType = 42
  135. )
  136. func getSQLCType(typeID uint32) int32 {
  137. switch typeID {
  138. case TYPE_BOOL:
  139. return XG_C_BOOL
  140. case TYPE_I1:
  141. return XG_C_TINYINT
  142. case TYPE_I2:
  143. return XG_C_SHORT
  144. case TYPE_I4:
  145. return XG_C_INTEGER
  146. case TYPE_I8:
  147. return XG_C_BIGINT
  148. case TYPE_R4:
  149. return XG_C_FLOAT
  150. case TYPE_R8:
  151. return XG_C_DOUBLE
  152. case TYPE_NUM:
  153. return XG_C_NUMERIC
  154. case TYPE_DATETIME:
  155. return XG_C_DATETIME
  156. case TYPE_DATETIME_TZ:
  157. return XG_C_DATETIME_TZ
  158. case TYPE_INTERVAL_Y2M:
  159. return XG_C_INTERVAL_YEAR_TO_MONTH
  160. case TYPE_INTERVAL_D2S:
  161. return XG_C_INTERVAL_DAY_TO_SECOND
  162. case TYPE_GUID:
  163. return TYPE_GUID + 40
  164. case TYPE_TIME_TZ:
  165. return XG_C_TIME_TZ
  166. case TYPE_DATE:
  167. return XG_C_DATE
  168. case TYPE_TIME:
  169. return XG_C_TIME
  170. case TYPE_BINARY:
  171. return XG_C_BINARY
  172. case TYPE_CLOB:
  173. return XG_C_CLOB
  174. case TYPE_BLOB:
  175. return XG_C_BLOB
  176. case TYPE_INTERVAL_Y, TYPE_INTERVAL_M, TYPE_INTERVAL_D, TYPE_INTERVAL_H,
  177. TYPE_INTERVAL_MI, TYPE_INTERVAL_S, TYPE_INTERVAL_D2H, TYPE_INTERVAL_D2M,
  178. TYPE_INTERVAL_H2M, TYPE_INTERVAL_H2S, TYPE_INTERVAL_M2S:
  179. return XG_C_INTERVAL
  180. default:
  181. return XG_C_CHAR
  182. }
  183. }
  184. /* {{ */
  185. func (self *xugusqlField) typeDatabaseName() string {
  186. switch self.fieldType {
  187. case fieldTypeBool:
  188. return "BOOLEAN"
  189. case fieldTypeChar:
  190. return "CHAR"
  191. case fieldTypeTinyint:
  192. return "TINYINT"
  193. case fieldTypeShort:
  194. return "SHORT"
  195. case fieldTypeInteger:
  196. return "INTEGER"
  197. case fieldTypeBigint:
  198. return "BIGINT"
  199. case fieldTypeFloat:
  200. return "FLOAT"
  201. case fieldTypeDouble:
  202. return "DOUBLE"
  203. case fieldTypeNumeric:
  204. return "NUMERIC"
  205. case fieldTypeDate:
  206. return "DATE"
  207. case fieldTypeTime:
  208. return "TIME"
  209. case fieldTypeTimeTZ:
  210. return "TIMEZONE"
  211. case fieldTypeDatetime:
  212. return "DATETIME"
  213. case fieldTypeDatetimeTZ:
  214. return "DATETIME TIMEZONE"
  215. case fieldTypeBinary:
  216. return "BINARY"
  217. case fieldTypeInterval:
  218. return "INTERVAL"
  219. case fieldTypeIntervalY2M:
  220. return "INTERVAL YEAR TO MONTH"
  221. case fieldTypeIntervalD2S:
  222. return "INTERVAL DAY TO SECOND"
  223. case fieldTypeClob:
  224. return "CLOB"
  225. case fieldTypeBlob:
  226. return "BLOB"
  227. default:
  228. return ""
  229. }
  230. }
  231. /* {{ */
  232. func (self *xugusqlField) scanType() reflect.Type {
  233. switch self.fieldType {
  234. case fieldTypeBool:
  235. return scanTypeBool
  236. case fieldTypeTinyint:
  237. return scanTypeInt8
  238. case fieldTypeShort:
  239. return scanTypeInt16
  240. case fieldTypeInteger:
  241. return scanTypeInt32
  242. case fieldTypeBigint:
  243. return scanTypeInt64
  244. case fieldTypeFloat:
  245. return scanTypeFloat32
  246. case fieldTypeDouble:
  247. return scanTypeFloat64
  248. case fieldTypeDate,
  249. fieldTypeTime,
  250. fieldTypeDatetime:
  251. return scanTypeNullTime
  252. case fieldTypeTimeTZ,
  253. fieldTypeDatetimeTZ,
  254. fieldTypeChar,
  255. fieldTypeBinary,
  256. fieldTypeInterval,
  257. fieldTypeNumeric,
  258. fieldTypeIntervalY2M,
  259. fieldTypeIntervalD2S,
  260. fieldTypeLob,
  261. fieldTypeClob,
  262. fieldTypeBlob:
  263. return scanTypeRawBytes
  264. default:
  265. return scanTypeUnknown
  266. }
  267. }
  268. var (
  269. scanTypeFloat32 = reflect.TypeOf(float32(0))
  270. scanTypeFloat64 = reflect.TypeOf(float64(0))
  271. scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
  272. scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
  273. scanTypeNullTime = reflect.TypeOf(time.Time{})
  274. scanTypeInt8 = reflect.TypeOf(int8(0))
  275. scanTypeInt16 = reflect.TypeOf(int16(0))
  276. scanTypeInt32 = reflect.TypeOf(int32(0))
  277. scanTypeInt64 = reflect.TypeOf(int64(0))
  278. scanTypeUnknown = reflect.TypeOf(new(interface{}))
  279. scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
  280. scanTypeUint8 = reflect.TypeOf(uint8(0))
  281. scanTypeUint16 = reflect.TypeOf(uint16(0))
  282. scanTypeUint32 = reflect.TypeOf(uint32(0))
  283. scanTypeUint64 = reflect.TypeOf(uint64(0))
  284. scanTypeBool = reflect.TypeOf(bool(false))
  285. )