h.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "math"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "unicode"
  12. )
  13. func encodeByString(x string, column column, conn DmConnection) ([]byte, error) {
  14. dt := make([]int, DT_LEN)
  15. if _, err := toDTFromString(x, dt); err != nil {
  16. return nil, err
  17. }
  18. return encode(dt, column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  19. }
  20. func encodeByTime(x time.Time, column column, conn DmConnection) ([]byte, error) {
  21. dt := toDTFromTime(x)
  22. return encode(dt, column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  23. }
  24. func toTimeFromString(str string, ltz int) time.Time {
  25. dt := make([]int, DT_LEN)
  26. toDTFromString(str, dt)
  27. return toTimeFromDT(dt, ltz)
  28. }
  29. func toTimeFromDT(dt []int, ltz int) time.Time {
  30. var year, month, day, hour, minute, second, nsec, tz int
  31. year = dt[OFFSET_YEAR]
  32. if dt[OFFSET_MONTH] > 0 {
  33. month = dt[OFFSET_MONTH]
  34. } else {
  35. month = 1
  36. }
  37. if dt[OFFSET_DAY] > 0 {
  38. day = dt[OFFSET_DAY]
  39. } else {
  40. day = 1
  41. }
  42. hour = dt[OFFSET_HOUR]
  43. minute = dt[OFFSET_MINUTE]
  44. second = dt[OFFSET_SECOND]
  45. nsec = dt[OFFSET_NANOSECOND]
  46. if dt[OFFSET_TIMEZONE] == INVALID_VALUE {
  47. tz = ltz * 60
  48. } else {
  49. tz = dt[OFFSET_TIMEZONE] * 60
  50. }
  51. return time.Date(year, time.Month(month), day, hour, minute, second, nsec, time.FixedZone("", tz))
  52. }
  53. func decode(value []byte, isBdta bool, column column, ltz int, dtz int) []int {
  54. var dt []int
  55. if isBdta {
  56. dt = dmdtDecodeBdta(value)
  57. } else {
  58. dt = dmdtDecodeFast(value)
  59. }
  60. if column.mask == MASK_LOCAL_DATETIME {
  61. transformTZ(dt, dtz, ltz)
  62. }
  63. return dt
  64. }
  65. func dmdtDecodeFast(value []byte) []int {
  66. dt := make([]int, DT_LEN)
  67. dt[OFFSET_TIMEZONE] = INVALID_VALUE
  68. dtype := 0
  69. if len(value) == DATE_PREC {
  70. dtype = DATE
  71. } else if len(value) == TIME_PREC {
  72. dtype = TIME
  73. } else if len(value) == TIME_TZ_PREC {
  74. dtype = TIME_TZ
  75. } else if len(value) == DATETIME_PREC {
  76. dtype = DATETIME
  77. } else if len(value) == DATETIME2_PREC {
  78. dtype = DATETIME2
  79. } else if len(value) == DATETIME_TZ_PREC {
  80. dtype = DATETIME_TZ
  81. } else if len(value) == DATETIME2_TZ_PREC {
  82. dtype = DATETIME2_TZ
  83. }
  84. if dtype == DATE {
  85. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0)) & 0x7FFF
  86. if dt[OFFSET_YEAR] > 9999 {
  87. dt[OFFSET_YEAR] = int(int16(dt[OFFSET_YEAR] | 0x8000))
  88. }
  89. dt[OFFSET_MONTH] = ((int(value[1]) >> 7) & 0x1) + ((int(value[2]) & 0x07) << 1)
  90. dt[OFFSET_DAY] = ((int(value[2]) & 0xF8) >> 3) & 0x1f
  91. } else if dtype == TIME {
  92. dt[OFFSET_HOUR] = int(value[0]) & 0x1F
  93. dt[OFFSET_MINUTE] = ((int(value[0]) >> 5) & 0x07) + ((int(value[1]) & 0x07) << 3)
  94. dt[OFFSET_SECOND] = ((int(value[1]) >> 3) & 0x1f) + ((int(value[2]) & 0x01) << 5)
  95. dt[OFFSET_NANOSECOND] = ((int(value[2]) >> 1) & 0x7f) + ((int(value[3]) & 0x00ff) << 7) + ((int(value[4]) & 0x1F) << 15)
  96. dt[OFFSET_NANOSECOND] *= 1000
  97. } else if dtype == TIME_TZ {
  98. dt[OFFSET_HOUR] = int(value[0]) & 0x1F
  99. dt[OFFSET_MINUTE] = ((int(value[0]) >> 5) & 0x07) + ((int(value[1]) & 0x07) << 3)
  100. dt[OFFSET_SECOND] = ((int(value[1]) >> 3) & 0x1f) + ((int(value[2]) & 0x01) << 5)
  101. dt[OFFSET_NANOSECOND] = ((int(value[2]) >> 1) & 0x7f) + ((int(value[3]) & 0x00ff) << 7) + ((int(value[4]) & 0x1F) << 15)
  102. dt[OFFSET_NANOSECOND] *= 1000
  103. dt[OFFSET_TIMEZONE] = int(Dm_build_1.Dm_build_98(value, 5))
  104. } else if dtype == DATETIME {
  105. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0)) & 0x7FFF
  106. if dt[OFFSET_YEAR] > 9999 {
  107. dt[OFFSET_YEAR] = int(int16(dt[OFFSET_YEAR] | 0x8000))
  108. }
  109. dt[OFFSET_MONTH] = ((int(value[1]) >> 7) & 0x1) + ((int(value[2]) & 0x07) << 1)
  110. dt[OFFSET_DAY] = ((int(value[2]) & 0xF8) >> 3) & 0x1f
  111. dt[OFFSET_HOUR] = (int(value[3]) & 0x1F)
  112. dt[OFFSET_MINUTE] = ((int(value[3]) >> 5) & 0x07) + ((int(value[4]) & 0x07) << 3)
  113. dt[OFFSET_SECOND] = ((int(value[4]) >> 3) & 0x1f) + ((int(value[5]) & 0x01) << 5)
  114. dt[OFFSET_NANOSECOND] = ((int(value[5]) >> 1) & 0x7f) + ((int(value[6]) & 0x00ff) << 7) + ((int(value[7]) & 0x1F) << 15)
  115. dt[OFFSET_NANOSECOND] *= 1000
  116. } else if dtype == DATETIME_TZ {
  117. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0)) & 0x7FFF
  118. if dt[OFFSET_YEAR] > 9999 {
  119. dt[OFFSET_YEAR] = int(int16(dt[OFFSET_YEAR] | 0x8000))
  120. }
  121. dt[OFFSET_MONTH] = ((int(value[1]) >> 7) & 0x1) + ((int(value[2]) & 0x07) << 1)
  122. dt[OFFSET_DAY] = ((int(value[2]) & 0xF8) >> 3) & 0x1f
  123. dt[OFFSET_HOUR] = (int(value[3]) & 0x1F)
  124. dt[OFFSET_MINUTE] = ((int(value[3]) >> 5) & 0x07) + ((int(value[4]) & 0x07) << 3)
  125. dt[OFFSET_SECOND] = ((int(value[4]) >> 3) & 0x1f) + ((int(value[5]) & 0x01) << 5)
  126. dt[OFFSET_NANOSECOND] = ((int(value[5]) >> 1) & 0x7f) + ((int(value[6]) & 0x00ff) << 7) + ((int(value[7]) & 0x1F) << 15)
  127. dt[OFFSET_NANOSECOND] *= 1000
  128. dt[OFFSET_TIMEZONE] = int(Dm_build_1.Dm_build_98(value, len(value)-2))
  129. } else if dtype == DATETIME2 {
  130. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0)) & 0x7FFF
  131. if dt[OFFSET_YEAR] > 9999 {
  132. dt[OFFSET_YEAR] = int(int16(dt[OFFSET_YEAR] | 0x8000))
  133. }
  134. dt[OFFSET_MONTH] = ((int(value[1]) >> 7) & 0x1) + ((int(value[2]) & 0x07) << 1)
  135. dt[OFFSET_DAY] = ((int(value[2]) & 0xF8) >> 3) & 0x1f
  136. dt[OFFSET_HOUR] = (int(value[3]) & 0x1F)
  137. dt[OFFSET_MINUTE] = ((int(value[3]) >> 5) & 0x07) + ((int(value[4]) & 0x07) << 3)
  138. dt[OFFSET_SECOND] = ((int(value[4]) >> 3) & 0x1f) + ((int(value[5]) & 0x01) << 5)
  139. dt[OFFSET_NANOSECOND] = ((int(value[5]) >> 1) & 0x7f) + ((int(value[6]) & 0x00ff) << 7) + ((int(value[7]) & 0x00ff) << 15) + ((int(value[8]) & 0x7F) << 23)
  140. } else if dtype == DATETIME2_TZ {
  141. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0)) & 0x7FFF
  142. if dt[OFFSET_YEAR] > 9999 {
  143. dt[OFFSET_YEAR] = int(int16(dt[OFFSET_YEAR] | 0x8000))
  144. }
  145. dt[OFFSET_MONTH] = ((int(value[1]) >> 7) & 0x1) + ((int(value[2]) & 0x07) << 1)
  146. dt[OFFSET_DAY] = ((int(value[2]) & 0xF8) >> 3) & 0x1f
  147. dt[OFFSET_HOUR] = (int(value[3]) & 0x1F)
  148. dt[OFFSET_MINUTE] = ((int(value[3]) >> 5) & 0x07) + ((int(value[4]) & 0x07) << 3)
  149. dt[OFFSET_SECOND] = ((int(value[4]) >> 3) & 0x1f) + ((int(value[5]) & 0x01) << 5)
  150. dt[OFFSET_NANOSECOND] = ((int(value[5]) >> 1) & 0x7f) + ((int(value[6]) & 0x00ff) << 7) + ((int(value[7]) & 0x00ff) << 15) + ((int(value[8]) & 0x7F) << 23)
  151. dt[OFFSET_TIMEZONE] = int(Dm_build_1.Dm_build_98(value, len(value)-2))
  152. }
  153. return dt
  154. }
  155. func dmdtDecodeBdta(value []byte) []int {
  156. dt := make([]int, DT_LEN)
  157. dt[OFFSET_YEAR] = int(Dm_build_1.Dm_build_98(value, 0))
  158. dt[OFFSET_MONTH] = int(value[2] & 0xFF)
  159. dt[OFFSET_DAY] = int(value[3] & 0xFF)
  160. dt[OFFSET_HOUR] = int(value[4] & 0xFF)
  161. dt[OFFSET_MINUTE] = int(value[5] & 0xFF)
  162. dt[OFFSET_SECOND] = int(value[6] & 0xFF)
  163. dt[OFFSET_NANOSECOND] = int((value[7] & 0xFF) + (value[8] << 8) + (value[9] << 16))
  164. dt[OFFSET_TIMEZONE] = int(Dm_build_1.Dm_build_98(value, 10))
  165. if len(value) > 12 {
  166. dt[OFFSET_NANOSECOND] += int(value[12] << 24)
  167. }
  168. return dt
  169. }
  170. func dtToStringByOracleFormat(dt []int, oracleFormatPattern string, scale int32, language int) string {
  171. return format(dt, oracleFormatPattern, scale, language)
  172. }
  173. func dtToString(dt []int, dtype int, scale int) string {
  174. switch dtype {
  175. case DATE:
  176. return formatYear(dt[OFFSET_YEAR]) + "-" + format2(dt[OFFSET_MONTH]) + "-" + format2(dt[OFFSET_DAY])
  177. case TIME:
  178. if scale > 0 {
  179. return format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + "." + formatMilliSecond(dt[OFFSET_NANOSECOND], scale)
  180. } else {
  181. return format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND])
  182. }
  183. case TIME_TZ:
  184. if scale > 0 {
  185. return format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + "." + formatMilliSecond(dt[OFFSET_NANOSECOND], scale) + " " + formatTZ(dt[OFFSET_TIMEZONE])
  186. } else {
  187. return format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + " " + formatTZ(dt[OFFSET_TIMEZONE])
  188. }
  189. case DATETIME, DATETIME2:
  190. if scale > 0 {
  191. return formatYear(dt[OFFSET_YEAR]) + "-" + format2(dt[OFFSET_MONTH]) + "-" + format2(dt[OFFSET_DAY]) + " " + format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + "." + formatMilliSecond(dt[OFFSET_NANOSECOND], scale)
  192. } else {
  193. return formatYear(dt[OFFSET_YEAR]) + "-" + format2(dt[OFFSET_MONTH]) + "-" + format2(dt[OFFSET_DAY]) + " " + format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND])
  194. }
  195. case DATETIME_TZ, DATETIME2_TZ:
  196. if scale > 0 {
  197. return formatYear(dt[OFFSET_YEAR]) + "-" + format2(dt[OFFSET_MONTH]) + "-" + format2(dt[OFFSET_DAY]) + " " + format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + "." + formatMilliSecond(dt[OFFSET_NANOSECOND], scale) + " " + formatTZ(dt[OFFSET_TIMEZONE])
  198. } else {
  199. return formatYear(dt[OFFSET_YEAR]) + "-" + format2(dt[OFFSET_MONTH]) + "-" + format2(dt[OFFSET_DAY]) + " " + format2(dt[OFFSET_HOUR]) + ":" + format2(dt[OFFSET_MINUTE]) + ":" + format2(dt[OFFSET_SECOND]) + " " + formatTZ(dt[OFFSET_TIMEZONE])
  200. }
  201. }
  202. return ""
  203. }
  204. func formatYear(value int) string {
  205. if value >= 0 {
  206. if value < 10 {
  207. return "000" + strconv.FormatInt(int64(value), 10)
  208. } else if value < 100 {
  209. return "00" + strconv.FormatInt(int64(value), 10)
  210. } else if value < 1000 {
  211. return "0" + strconv.FormatInt(int64(value), 10)
  212. } else {
  213. return strconv.FormatInt(int64(value), 10)
  214. }
  215. } else {
  216. if value > -10 {
  217. return "-000" + strconv.FormatInt(int64(-value), 10)
  218. } else if value > -100 {
  219. return "-00" + strconv.FormatInt(int64(-value), 10)
  220. } else if value > -1000 {
  221. return "-0" + strconv.FormatInt(int64(-value), 10)
  222. } else {
  223. return strconv.FormatInt(int64(value), 10)
  224. }
  225. }
  226. }
  227. func format2(value int) string {
  228. if value < 10 {
  229. return "0" + strconv.FormatInt(int64(value), 10)
  230. } else {
  231. return strconv.FormatInt(int64(value), 10)
  232. }
  233. }
  234. func formatMilliSecond(ms int, prec int) string {
  235. var ret string
  236. if ms < 10 {
  237. ret = "00000000" + strconv.FormatInt(int64(ms), 10)
  238. } else if ms < 100 {
  239. ret = "0000000" + strconv.FormatInt(int64(ms), 10)
  240. } else if ms < 1000 {
  241. ret = "000000" + strconv.FormatInt(int64(ms), 10)
  242. } else if ms < 10000 {
  243. ret = "00000" + strconv.FormatInt(int64(ms), 10)
  244. } else if ms < 100000 {
  245. ret = "0000" + strconv.FormatInt(int64(ms), 10)
  246. } else if ms < 1000000 {
  247. ret = "000" + strconv.FormatInt(int64(ms), 10)
  248. } else if ms < 10000000 {
  249. ret = "00" + strconv.FormatInt(int64(ms), 10)
  250. } else if ms < 100000000 {
  251. ret = "0" + strconv.FormatInt(int64(ms), 10)
  252. } else {
  253. ret = strconv.FormatInt(int64(ms), 10)
  254. }
  255. if prec < NANOSECOND_DIGITS {
  256. ret = ret[:prec]
  257. }
  258. return ret
  259. }
  260. func formatTZ(tz int) string {
  261. tz_hour := int(math.Abs(float64(tz / 60)))
  262. tz_min := int(math.Abs(float64(tz % 60)))
  263. if tz >= 0 {
  264. return "+" + format2(tz_hour) + ":" + format2(tz_min)
  265. } else {
  266. return "-" + format2(tz_hour) + ":" + format2(tz_min)
  267. }
  268. }
  269. func toDTFromTime(x time.Time) []int {
  270. hour, min, sec := x.Clock()
  271. ts := make([]int, DT_LEN)
  272. ts[OFFSET_YEAR] = x.Year()
  273. ts[OFFSET_MONTH] = int(x.Month())
  274. ts[OFFSET_DAY] = x.Day()
  275. ts[OFFSET_HOUR] = hour
  276. ts[OFFSET_MINUTE] = min
  277. ts[OFFSET_SECOND] = sec
  278. ts[OFFSET_NANOSECOND] = (int)(x.Nanosecond())
  279. _, tz := x.Zone()
  280. ts[OFFSET_TIMEZONE] = tz / 60
  281. return ts
  282. }
  283. func toDTFromUnix(sec int64, nsec int64) []int {
  284. return toDTFromTime(time.Unix(sec, nsec))
  285. }
  286. func toDTFromString(s string, dt []int) (dtype int, err error) {
  287. defer func() {
  288. if p := recover(); p != nil {
  289. err = ECGO_INVALID_DATETIME_FORMAT.throw()
  290. }
  291. }()
  292. date_s := ""
  293. time_s := ""
  294. nanos_s := ""
  295. tz_s := ""
  296. year := 0
  297. month := 0
  298. day := 0
  299. hour := 0
  300. minute := 0
  301. second := 0
  302. a_nanos := 0
  303. firstDash := -1
  304. secondDash := -1
  305. firstColon := -1
  306. secondColon := -1
  307. period := -1
  308. sign := 0
  309. ownTz := INVALID_VALUE
  310. dtype = -1
  311. zeros := "000000000"
  312. if s != "" && strings.TrimSpace(s) == "" {
  313. return 0, ECGO_INVALID_DATETIME_FORMAT.throw()
  314. }
  315. s = strings.TrimSpace(s)
  316. if strings.Index(s, "-") == 0 {
  317. s = strings.TrimSpace(s[1:])
  318. sign = 1
  319. }
  320. comps := strings.Split(s, " ")
  321. switch len(comps) {
  322. case 3:
  323. date_s = comps[0]
  324. time_s = comps[1]
  325. tz_s = comps[2]
  326. dtype = DATETIME_TZ
  327. case 2:
  328. if strings.Index(comps[0], ":") > 0 {
  329. time_s = comps[0]
  330. tz_s = comps[1]
  331. dtype = TIME_TZ
  332. } else {
  333. date_s = comps[0]
  334. time_s = comps[1]
  335. dtype = DATETIME
  336. }
  337. case 1:
  338. if strings.Index(comps[0], ":") > 0 {
  339. time_s = comps[0]
  340. dtype = TIME
  341. } else {
  342. date_s = comps[0]
  343. dtype = DATE
  344. }
  345. default:
  346. return 0, ECGO_INVALID_DATETIME_FORMAT.throw()
  347. }
  348. if date_s != "" {
  349. firstDash = strings.Index(date_s, "-")
  350. secondDash = strings.Index(date_s[firstDash+1:], "-")
  351. if firstDash < 0 || secondDash < 0 {
  352. firstDash = strings.Index(s, ".")
  353. secondDash = strings.Index(date_s[firstDash+1:], ".")
  354. }
  355. if firstDash < 0 || secondDash < 0 {
  356. firstDash = strings.Index(s, "/")
  357. secondDash = strings.Index(date_s[firstDash+1:], "/")
  358. }
  359. if secondDash > 0 {
  360. secondDash += firstDash + 1
  361. }
  362. if (firstDash > 0) && (secondDash > 0) && (secondDash < len(date_s)-1) {
  363. if sign == 1 {
  364. i, err := strconv.ParseInt(date_s[:firstDash], 10, 32)
  365. if err != nil {
  366. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  367. }
  368. year = 0 - int(i) - 1900
  369. } else {
  370. i, err := strconv.ParseInt(date_s[:firstDash], 10, 32)
  371. if err != nil {
  372. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  373. }
  374. year = int(i) - 1900
  375. }
  376. i, err := strconv.ParseInt(date_s[firstDash+1:secondDash], 10, 32)
  377. if err != nil {
  378. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  379. }
  380. month = int(i) - 1
  381. i, err = strconv.ParseInt(date_s[secondDash+1:], 10, 32)
  382. if err != nil {
  383. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  384. }
  385. day = int(i)
  386. if !checkDate(year+1900, month+1, day) {
  387. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  388. }
  389. } else {
  390. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  391. }
  392. }
  393. if time_s != "" {
  394. firstColon = strings.Index(time_s, ":")
  395. secondColon = strings.Index(time_s[firstColon+1:], ":")
  396. if secondColon > 0 {
  397. secondColon += firstColon + 1
  398. }
  399. period = strings.Index(time_s[secondColon+1:], ".")
  400. if period > 0 {
  401. period += secondColon + 1
  402. }
  403. if (firstColon > 0) && (secondColon > 0) && (secondColon < len(time_s)-1) {
  404. i, err := strconv.ParseInt(time_s[:firstColon], 10, 32)
  405. if err != nil {
  406. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  407. }
  408. hour = int(i)
  409. i, err = strconv.ParseInt(time_s[firstColon+1:secondColon], 10, 32)
  410. if err != nil {
  411. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  412. }
  413. minute = int(i)
  414. if period > 0 && period < len(time_s)-1 {
  415. i, err = strconv.ParseInt(time_s[secondColon+1:period], 10, 32)
  416. if err != nil {
  417. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  418. }
  419. second = int(i)
  420. nanos_s = time_s[period+1:]
  421. if len(nanos_s) > NANOSECOND_DIGITS {
  422. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  423. }
  424. if !unicode.IsDigit(rune(nanos_s[0])) {
  425. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  426. }
  427. nanos_s = nanos_s + zeros[0:NANOSECOND_DIGITS-len(nanos_s)]
  428. i, err = strconv.ParseInt(nanos_s, 10, 32)
  429. if err != nil {
  430. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  431. }
  432. a_nanos = int(i)
  433. } else if period > 0 {
  434. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  435. } else {
  436. i, err = strconv.ParseInt(time_s[secondColon+1:], 10, 32)
  437. if err != nil {
  438. return 0, ECGO_INVALID_DATETIME_FORMAT.addDetailln(err.Error()).throw()
  439. }
  440. second = int(i)
  441. }
  442. if hour >= 24 || hour < 0 || minute >= 60 || minute < 0 || second >= 60 || second < 0 {
  443. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  444. }
  445. } else {
  446. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  447. }
  448. }
  449. if tz_s != "" {
  450. neg := false
  451. if strings.Index(tz_s, "-") == 0 {
  452. neg = true
  453. }
  454. if strings.Index(tz_s, "-") == 0 || strings.Index(tz_s, "+") == 0 {
  455. tz_s = strings.TrimSpace(tz_s[1:])
  456. }
  457. hm := strings.Split(tz_s, ":")
  458. var tzh, tzm int16 = 0, 0
  459. switch len(hm) {
  460. case 2:
  461. s, err := strconv.ParseInt(strings.TrimSpace(hm[0]), 10, 16)
  462. if err != nil {
  463. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  464. }
  465. tzh = int16(s)
  466. s, err = strconv.ParseInt(strings.TrimSpace(hm[1]), 10, 16)
  467. if err != nil {
  468. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  469. }
  470. tzm = int16(s)
  471. case 1:
  472. s, err := strconv.ParseInt(strings.TrimSpace(hm[0]), 10, 16)
  473. if err != nil {
  474. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  475. }
  476. tzh = int16(s)
  477. default:
  478. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  479. }
  480. ownTz = int(tzh*60 + tzm)
  481. if ownTz < 0 {
  482. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  483. }
  484. if neg {
  485. ownTz *= -1
  486. }
  487. if ownTz <= -13*60 || ownTz > 14*60 {
  488. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  489. }
  490. }
  491. dt[OFFSET_YEAR] = year + 1900
  492. dt[OFFSET_MONTH] = month + 1
  493. if day == 0 {
  494. dt[OFFSET_DAY] = 1
  495. } else {
  496. dt[OFFSET_DAY] = day
  497. }
  498. dt[OFFSET_HOUR] = hour
  499. dt[OFFSET_MINUTE] = minute
  500. dt[OFFSET_SECOND] = second
  501. dt[OFFSET_NANOSECOND] = a_nanos
  502. dt[OFFSET_TIMEZONE] = int(ownTz)
  503. return dtype, nil
  504. }
  505. func transformTZ(dt []int, defaultSrcTz int, destTz int) {
  506. srcTz := defaultSrcTz
  507. if srcTz != INVALID_VALUE && destTz != INVALID_VALUE && destTz != srcTz {
  508. dt = addMinute(dt, destTz-srcTz)
  509. dt[OFFSET_TIMEZONE] = destTz
  510. }
  511. }
  512. func encode(dt []int, column column, lTz int, dTz int) ([]byte, error) {
  513. if dt[OFFSET_TIMEZONE] != INVALID_VALUE {
  514. transformTZ(dt, dt[OFFSET_TIMEZONE], lTz)
  515. }
  516. if column.mask == MASK_LOCAL_DATETIME {
  517. transformTZ(dt, dt[OFFSET_TIMEZONE], dTz)
  518. }
  519. if dt[OFFSET_YEAR] < -4712 || dt[OFFSET_YEAR] > 9999 {
  520. return nil, ECGO_DATETIME_OVERFLOW.throw()
  521. }
  522. year := dt[OFFSET_YEAR]
  523. month := dt[OFFSET_MONTH]
  524. day := dt[OFFSET_DAY]
  525. hour := dt[OFFSET_HOUR]
  526. min := dt[OFFSET_MINUTE]
  527. sec := dt[OFFSET_SECOND]
  528. msec := dt[OFFSET_NANOSECOND]
  529. var tz int
  530. if dt[OFFSET_TIMEZONE] == INVALID_VALUE {
  531. tz = dTz
  532. } else {
  533. tz = dt[OFFSET_TIMEZONE]
  534. }
  535. var ret []byte
  536. if column.colType == DATE {
  537. ret = make([]byte, 3)
  538. ret[0] = (byte)(year & 0xFF)
  539. if year >= 0 {
  540. ret[1] = (byte)((year >> 8) | ((month & 0x01) << 7))
  541. } else {
  542. ret[1] = (byte)((year >> 8) & (((month & 0x01) << 7) | 0x7f))
  543. }
  544. ret[2] = (byte)(((month & 0x0E) >> 1) | (day << 3))
  545. } else if column.colType == DATETIME {
  546. msec /= 1000
  547. ret = make([]byte, 8)
  548. ret[0] = (byte)(year & 0xFF)
  549. if year >= 0 {
  550. ret[1] = (byte)((year >> 8) | ((month & 0x01) << 7))
  551. } else {
  552. ret[1] = (byte)((year >> 8) & (((month & 0x01) << 7) | 0x7f))
  553. }
  554. ret[2] = (byte)(((month & 0x0E) >> 1) | (day << 3))
  555. ret[3] = (byte)(hour | ((min & 0x07) << 5))
  556. ret[4] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  557. ret[5] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  558. ret[6] = (byte)((msec >> 7) & 0xFF)
  559. ret[7] = (byte)((msec >> 15) & 0xFF)
  560. } else if column.colType == DATETIME2 {
  561. ret = make([]byte, 9)
  562. ret[0] = (byte)(year & 0xFF)
  563. if year >= 0 {
  564. ret[1] = (byte)((year >> 8) | ((month & 0x01) << 7))
  565. } else {
  566. ret[1] = (byte)((year >> 8) & (((month & 0x01) << 7) | 0x7f))
  567. }
  568. ret[2] = (byte)(((month & 0x0E) >> 1) | (day << 3))
  569. ret[3] = (byte)(hour | ((min & 0x07) << 5))
  570. ret[4] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  571. ret[5] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  572. ret[6] = (byte)((msec >> 7) & 0xFF)
  573. ret[7] = (byte)((msec >> 15) & 0xFF)
  574. ret[8] = (byte)((msec >> 23) & 0xFF)
  575. } else if column.colType == DATETIME_TZ {
  576. msec /= 1000
  577. ret = make([]byte, 10)
  578. ret[0] = (byte)(year & 0xFF)
  579. if year >= 0 {
  580. ret[1] = (byte)((year >> 8) | ((month & 0x01) << 7))
  581. } else {
  582. ret[1] = (byte)((year >> 8) & (((month & 0x01) << 7) | 0x7f))
  583. }
  584. ret[2] = (byte)(((month & 0x0E) >> 1) | (day << 3))
  585. ret[3] = (byte)(hour | ((min & 0x07) << 5))
  586. ret[4] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  587. ret[5] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  588. ret[6] = (byte)((msec >> 7) & 0xFF)
  589. ret[7] = (byte)((msec >> 15) & 0xFF)
  590. Dm_build_1.Dm_build_12(ret, 8, int16(tz))
  591. } else if column.colType == DATETIME2_TZ {
  592. ret = make([]byte, 11)
  593. ret[0] = (byte)(year & 0xFF)
  594. if year >= 0 {
  595. ret[1] = (byte)((year >> 8) | ((month & 0x01) << 7))
  596. } else {
  597. ret[1] = (byte)((year >> 8) & (((month & 0x01) << 7) | 0x7f))
  598. }
  599. ret[2] = (byte)(((month & 0x0E) >> 1) | (day << 3))
  600. ret[3] = (byte)(hour | ((min & 0x07) << 5))
  601. ret[4] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  602. ret[5] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  603. ret[6] = (byte)((msec >> 7) & 0xFF)
  604. ret[7] = (byte)((msec >> 15) & 0xFF)
  605. ret[8] = (byte)((msec >> 23) & 0xFF)
  606. Dm_build_1.Dm_build_12(ret, 8, int16(tz))
  607. } else if column.colType == TIME {
  608. msec /= 1000
  609. ret = make([]byte, 5)
  610. ret[0] = (byte)(hour | ((min & 0x07) << 5))
  611. ret[1] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  612. ret[2] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  613. ret[3] = (byte)((msec >> 7) & 0xFF)
  614. ret[4] = (byte)((msec >> 15) & 0xFF)
  615. } else if column.colType == TIME_TZ {
  616. msec /= 1000
  617. ret = make([]byte, 7)
  618. ret[0] = (byte)(hour | ((min & 0x07) << 5))
  619. ret[1] = (byte)(((min & 0x38) >> 3) | ((sec & 0x1F) << 3))
  620. ret[2] = (byte)(((sec & 0x20) >> 5) | ((msec & 0x7F) << 1))
  621. ret[3] = (byte)((msec >> 7) & 0xFF)
  622. ret[4] = (byte)((msec >> 15) & 0xFF)
  623. Dm_build_1.Dm_build_12(ret, 5, int16(tz))
  624. }
  625. return ret, nil
  626. }
  627. func toDate(x int64, column column, conn DmConnection) ([]byte, error) {
  628. switch column.colType {
  629. case DATETIME, DATETIME2:
  630. if x > 2958463*24*60*60 {
  631. return nil, ECGO_DATETIME_OVERFLOW.throw()
  632. }
  633. dt := toDTFromUnix(x-Seconds_1900_1970, 0)
  634. return encode(dt, column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  635. case TIME:
  636. dt := toDTFromUnix(x, 0)
  637. return encode(dt, column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  638. case DATE:
  639. if x > 2958463 {
  640. return nil, ECGO_DATETIME_OVERFLOW.throw()
  641. }
  642. dt := toDTFromUnix(x*24*60*60-Seconds_1900_1970, 0)
  643. if dt[OFFSET_YEAR] < -4712 || dt[OFFSET_YEAR] > 9999 {
  644. return nil, ECGO_DATETIME_OVERFLOW.throw()
  645. }
  646. return encode(dt, column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  647. default:
  648. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  649. }
  650. }
  651. func checkDate(year int, month int, day int) bool {
  652. if year > 9999 || year < -4712 || month > 12 || month < 1 {
  653. return false
  654. }
  655. monthDays := getDaysOfMonth(year, month)
  656. if day > monthDays || day < 1 {
  657. return false
  658. }
  659. return true
  660. }
  661. func getDaysOfMonth(year int, month int) int {
  662. switch month {
  663. case 1, 3, 5, 7, 8, 10, 12:
  664. return 31
  665. case 4, 6, 9, 11:
  666. return 30
  667. case 2:
  668. if isLeapYear(year) {
  669. return 29
  670. }
  671. return 28
  672. default:
  673. return 0
  674. }
  675. }
  676. func isLeapYear(year int) bool {
  677. return (year%4 == 0 && year%100 != 0) || year%400 == 0
  678. }
  679. func addYear(dt []int, n int) []int {
  680. dt[OFFSET_YEAR] += n
  681. return dt
  682. }
  683. func addMonth(dt []int, n int) []int {
  684. month := dt[OFFSET_MONTH] + n
  685. addYearValue := month / 12
  686. if month %= 12; month < 1 {
  687. month += 12
  688. addYearValue--
  689. }
  690. daysOfMonth := getDaysOfMonth(dt[OFFSET_YEAR], month)
  691. if dt[OFFSET_DAY] > daysOfMonth {
  692. dt[OFFSET_DAY] = daysOfMonth
  693. }
  694. dt[OFFSET_MONTH] = month
  695. addYear(dt, addYearValue)
  696. return dt
  697. }
  698. func addDay(dt []int, n int) []int {
  699. tmp := dt[OFFSET_DAY] + n
  700. monthDays := 0
  701. monthDays = getDaysOfMonth(dt[OFFSET_YEAR], dt[OFFSET_MONTH])
  702. for tmp > monthDays || tmp <= 0 {
  703. if tmp > monthDays {
  704. addMonth(dt, 1)
  705. tmp -= monthDays
  706. } else {
  707. addMonth(dt, -1)
  708. tmp += monthDays
  709. }
  710. }
  711. dt[OFFSET_DAY] = tmp
  712. return dt
  713. }
  714. func addHour(dt []int, n int) []int {
  715. hour := dt[OFFSET_HOUR] + n
  716. addDayValue := hour / 24
  717. if hour %= 24; hour < 0 {
  718. hour += 24
  719. addDayValue--
  720. }
  721. dt[OFFSET_HOUR] = hour
  722. addDay(dt, addDayValue)
  723. return dt
  724. }
  725. func addMinute(dt []int, n int) []int {
  726. minute := dt[OFFSET_MINUTE] + n
  727. addHourValue := minute / 60
  728. if minute %= 60; minute < 0 {
  729. minute += 60
  730. addHourValue--
  731. }
  732. dt[OFFSET_MINUTE] = minute
  733. addHour(dt, addHourValue)
  734. return dt
  735. }