zzn.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "database/sql"
  8. "database/sql/driver"
  9. "math"
  10. "reflect"
  11. "strings"
  12. "time"
  13. )
  14. const (
  15. INT8_MAX int8 = math.MaxInt8
  16. INT8_MIN int8 = math.MinInt8
  17. BYTE_MAX byte = math.MaxUint8
  18. BYTE_MIN byte = 0
  19. INT16_MAX int16 = math.MaxInt16
  20. INT16_MIN int16 = math.MinInt16
  21. UINT16_MAX uint16 = math.MaxUint16
  22. UINT16_MIN uint16 = 0
  23. INT32_MAX int32 = math.MaxInt32
  24. INT32_MIN int32 = math.MinInt32
  25. UINT32_MAX uint32 = math.MaxUint32
  26. UINT32_MIN uint32 = 0
  27. INT64_MAX int64 = math.MaxInt64
  28. INT64_MIN int64 = math.MinInt64
  29. UINT64_MAX uint64 = math.MaxUint64
  30. UINT64_MIN uint64 = 0
  31. FLOAT32_MAX float32 = 3.4e+38
  32. FLOAT32_MIN float32 = -3.4e+38
  33. BYTE_SIZE = 1
  34. USINT_SIZE = 2
  35. ULINT_SIZE = 4
  36. DDWORD_SIZE = 8
  37. LINT64_SIZE = 8
  38. CHAR = 0
  39. VARCHAR2 = 1
  40. VARCHAR = 2
  41. BIT = 3
  42. TINYINT = 5
  43. SMALLINT = 6
  44. INT = 7
  45. BIGINT = 8
  46. DECIMAL = 9
  47. REAL = 10
  48. DOUBLE = 11
  49. BLOB = 12
  50. BOOLEAN = 13
  51. DATE = 14
  52. TIME = 15
  53. DATETIME = 16
  54. BINARY = 17
  55. VARBINARY = 18
  56. CLOB = 19
  57. INTERVAL_YM = 20
  58. INTERVAL_DT = 21
  59. TIME_TZ = 22
  60. DATETIME_TZ = 23
  61. XDEC_INT32 = 24
  62. XDEC_INT64 = 25
  63. DATETIME2 = 26
  64. DATETIME2_TZ = 27
  65. NULL = 28
  66. ANY = 31
  67. STAR_ALL = 32
  68. STAR = 33
  69. RECORD = 40
  70. TYPE = 41
  71. TYPE_REF = 42
  72. UNKNOWN = 54
  73. ARRAY = 117
  74. CLASS = 119
  75. CURSOR = 120
  76. PLTYPE_RECORD = 121
  77. SARRAY = 122
  78. CURSOR_ORACLE = -10
  79. BIT_PREC = BYTE_SIZE
  80. TINYINT_PREC = BYTE_SIZE
  81. SMALLINT_PREC = USINT_SIZE
  82. INT_PREC = ULINT_SIZE
  83. BIGINT_PREC = LINT64_SIZE
  84. REAL_PREC = 4
  85. DOUBLE_PREC = 8
  86. DATE_PREC = 3
  87. TIME_PREC = 5
  88. DATETIME_PREC = 8
  89. DATETIME2_PREC = 9
  90. TIME_TZ_PREC = TIME_PREC + 2
  91. DATETIME_TZ_PREC = DATETIME_PREC + 2
  92. DATETIME2_TZ_PREC = DATETIME2_PREC + 2
  93. INTERVAL_YM_PREC = 3 * ULINT_SIZE
  94. INTERVAL_DT_PREC = 6 * ULINT_SIZE
  95. VARCHAR_PREC = 8188
  96. VARBINARY_PREC = 8188
  97. BLOB_PREC int32 = INT32_MAX
  98. CLOB_PREC int32 = INT32_MAX
  99. NULL_PREC = 0
  100. LOCAL_TIME_ZONE_SCALE_MASK = 0x00001000
  101. BFILE_PREC = 512
  102. BFILE_SCALE = 6
  103. COMPLEX_SCALE = 5
  104. CURRENCY_PREC = 19
  105. CURRENCY_SCALE = 4
  106. LOCAL_DATETIME_SCALE_MASK int32 = 0x00001000
  107. ORACLE_FLOAT_SCALE_MASK int32 = 0x81
  108. ORACLE_DATE_SCALE_MASK int32 = 0x00002000
  109. )
  110. func isComplexType(colType int, scale int) bool {
  111. return (colType == BLOB && scale == COMPLEX_SCALE) || colType == ARRAY || colType == SARRAY || colType == CLASS || colType == PLTYPE_RECORD
  112. }
  113. func isLocalTimeZone(colType int, scale int) bool {
  114. return (colType == DATETIME || colType == DATETIME2) && (scale&LOCAL_TIME_ZONE_SCALE_MASK) != 0
  115. }
  116. func getLocalTimeZoneScale(colType int, scale int) int {
  117. return scale & (^LOCAL_TIME_ZONE_SCALE_MASK)
  118. }
  119. func isFloat(colType int, scale int) bool {
  120. return colType == DECIMAL && scale == int(ORACLE_FLOAT_SCALE_MASK)
  121. }
  122. func getFloatPrec(prec int) int {
  123. return int(math.Round(float64(prec)*0.30103)) + 1
  124. }
  125. func getFloatScale(scale int) int {
  126. return scale & (^int(ORACLE_FLOAT_SCALE_MASK))
  127. }
  128. var (
  129. scanTypeFloat32 = reflect.TypeOf(float32(0))
  130. scanTypeFloat64 = reflect.TypeOf(float64(0))
  131. scanTypeBool = reflect.TypeOf(false)
  132. scanTypeInt8 = reflect.TypeOf(int8(0))
  133. scanTypeInt16 = reflect.TypeOf(int16(0))
  134. scanTypeInt32 = reflect.TypeOf(int32(0))
  135. scanTypeInt64 = reflect.TypeOf(int64(0))
  136. scanTypeNullBool = reflect.TypeOf(sql.NullBool{})
  137. scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
  138. scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
  139. scanTypeNullString = reflect.TypeOf(sql.NullString{})
  140. scanTypeNullTime = reflect.TypeOf(sql.NullTime{})
  141. scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
  142. scanTypeString = reflect.TypeOf("")
  143. scanTypeTime = reflect.TypeOf(time.Now())
  144. scanTypeUnknown = reflect.TypeOf(new(interface{}))
  145. )
  146. func (column *column) ScanType() reflect.Type {
  147. switch column.colType {
  148. case BOOLEAN:
  149. if column.nullable {
  150. return scanTypeNullBool
  151. }
  152. return scanTypeBool
  153. case BIT:
  154. if strings.ToLower(column.typeName) == "boolean" {
  155. if column.nullable {
  156. return scanTypeNullBool
  157. }
  158. return scanTypeBool
  159. } else {
  160. if column.nullable {
  161. return scanTypeNullInt
  162. }
  163. return scanTypeInt8
  164. }
  165. case TINYINT:
  166. if column.nullable {
  167. return scanTypeNullInt
  168. }
  169. return scanTypeInt8
  170. case SMALLINT:
  171. if column.nullable {
  172. return scanTypeNullInt
  173. }
  174. return scanTypeInt16
  175. case INT:
  176. if column.nullable {
  177. return scanTypeNullInt
  178. }
  179. return scanTypeInt32
  180. case BIGINT:
  181. if column.nullable {
  182. return scanTypeNullInt
  183. }
  184. return scanTypeInt64
  185. case REAL:
  186. if column.nullable {
  187. return scanTypeNullFloat
  188. }
  189. return scanTypeFloat32
  190. case DOUBLE:
  191. if strings.ToLower(column.typeName) == "float" {
  192. if column.nullable {
  193. return scanTypeNullFloat
  194. }
  195. return scanTypeFloat32
  196. }
  197. if column.nullable {
  198. return scanTypeNullFloat
  199. }
  200. return scanTypeFloat64
  201. case DATE, TIME, DATETIME, DATETIME2:
  202. if column.nullable {
  203. return scanTypeNullTime
  204. }
  205. return scanTypeTime
  206. case DECIMAL, BINARY, VARBINARY, BLOB:
  207. return scanTypeRawBytes
  208. case CHAR, VARCHAR2, VARCHAR, CLOB:
  209. if column.nullable {
  210. return scanTypeNullString
  211. }
  212. return scanTypeString
  213. }
  214. return scanTypeUnknown
  215. }
  216. func (column *column) Length() (length int64, ok bool) {
  217. switch column.colType {
  218. case BINARY:
  219. case VARBINARY:
  220. case BLOB:
  221. case CHAR:
  222. case VARCHAR2:
  223. case VARCHAR:
  224. case CLOB:
  225. return int64(column.prec), true
  226. }
  227. return int64(0), false
  228. }
  229. func (column *column) PrecisionScale() (precision, scale int64, ok bool) {
  230. switch column.colType {
  231. case DECIMAL:
  232. if column.prec == 0 {
  233. return 38, int64(column.scale), true
  234. } else {
  235. return int64(column.prec), int64(column.scale), true
  236. }
  237. }
  238. return int64(0), int64(0), false
  239. }
  240. func (column *column) getColumnData(bytes []byte, conn *DmConnection) (driver.Value, error) {
  241. if bytes == nil {
  242. return nil, nil
  243. }
  244. switch column.colType {
  245. case BOOLEAN:
  246. return bytes[0] != 0, nil
  247. case BIT:
  248. if strings.ToLower(column.typeName) == "boolean" {
  249. return bytes[0] != 0, nil
  250. }
  251. return int8(bytes[0]), nil
  252. case TINYINT:
  253. return int8(bytes[0]), nil
  254. case SMALLINT:
  255. return Dm_build_1.Dm_build_98(bytes, 0), nil
  256. case INT:
  257. return Dm_build_1.Dm_build_103(bytes, 0), nil
  258. case BIGINT:
  259. return Dm_build_1.Dm_build_108(bytes, 0), nil
  260. case REAL:
  261. return Dm_build_1.Dm_build_113(bytes, 0), nil
  262. case DOUBLE:
  263. return Dm_build_1.Dm_build_117(bytes, 0), nil
  264. case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ, DATETIME2, DATETIME2_TZ:
  265. return DB2G.toTime(bytes, column, conn)
  266. case INTERVAL_DT:
  267. return newDmIntervalDTByBytes(bytes).String(), nil
  268. case INTERVAL_YM:
  269. return newDmIntervalYMByBytes(bytes).String(), nil
  270. case DECIMAL:
  271. tmp, err := DB2G.toDmDecimal(bytes, column, conn)
  272. if err != nil {
  273. return nil, err
  274. }
  275. return tmp.String(), nil
  276. case BINARY, VARBINARY:
  277. return bytes, nil
  278. case BLOB:
  279. if isComplexType(int(column.colType), int(column.scale)) {
  280. return DB2G.toComplexType(bytes, column, conn)
  281. }
  282. blob := DB2G.toDmBlob(bytes, column, conn)
  283. l, err := blob.GetLength()
  284. if err != nil {
  285. return nil, err
  286. }
  287. return blob.getBytes(1, int32(l))
  288. case CHAR, VARCHAR2, VARCHAR:
  289. return Dm_build_1.Dm_build_158(bytes, 0, len(bytes), conn.getServerEncoding(), conn), nil
  290. case CLOB:
  291. clob := DB2G.toDmClob(bytes, conn, column)
  292. l, err := clob.GetLength()
  293. if err != nil {
  294. return nil, err
  295. }
  296. return clob.getSubString(1, int32(l))
  297. }
  298. return string(bytes), nil
  299. }
  300. func emptyStringToNil(t int32) bool {
  301. switch t {
  302. case BOOLEAN, BIT, TINYINT, SMALLINT, INT, BIGINT, REAL, DOUBLE, DECIMAL, DATE, TIME,
  303. DATETIME, INTERVAL_DT, INTERVAL_YM, TIME_TZ, DATETIME_TZ, DATETIME2, DATETIME2_TZ:
  304. return true
  305. default:
  306. return false
  307. }
  308. }