diff --git a/api/src/main/nim/personal_measure_apipkg/db_util.nim b/api/src/main/nim/personal_measure_apipkg/db_util.nim index e99ec65..dde40ca 100644 --- a/api/src/main/nim/personal_measure_apipkg/db_util.nim +++ b/api/src/main/nim/personal_measure_apipkg/db_util.nim @@ -1,11 +1,11 @@ import json, macros, options, sequtils, strutils, times, timeutils, unicode, uuids +import nre except toSeq + const UNDERSCORE_RUNE = "_".toRunes[0] const PG_TIMESTAMP_FORMATS = [ "yyyy-MM-dd HH:mm:sszz", - "yyyy-MM-dd HH:mm:ss'.'fzz", - "yyyy-MM-dd HH:mm:ss'.'ffzz", "yyyy-MM-dd HH:mm:ss'.'fffzz" ] @@ -72,6 +72,19 @@ proc parsePGDatetime*(val: string): DateTime = for df in PG_TIMESTAMP_FORMATS: try: return val.parse(df) except: errStr &= "\n" & getCurrentExceptionMsg() + + # PostgreSQL does not pad the millisecond value in a datetime out to three + # decimal points. If this is a value like `2019-09-29 12:00:00.5Z` We need to + # manually catch this and pad it out to something like + # `2019-09-29 12:00:00.500Z` so that we can parse it. + const millisTruncDatePattern = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.)(\\d{1,2})(.*)" + let match = val.match(re(millisTruncDatePattern)) + if match.isSome: + let captures = match.get.captures + let reformatted = captures[0] & captures[1].alignLeft(3, '0') & captures[2] + try: return reformatted.parse(PG_TIMESTAMP_FORMATS[1]) + except: errStr &= "\n" & getCurrentExceptionMsg() + raise newException(ValueError, "Cannot parse PG date. Tried:" & errStr) proc parseDbArray*(val: string): seq[string] = diff --git a/api/src/main/nim/personal_measure_apipkg/version.nim b/api/src/main/nim/personal_measure_apipkg/version.nim index bd58bf0..e800848 100644 --- a/api/src/main/nim/personal_measure_apipkg/version.nim +++ b/api/src/main/nim/personal_measure_apipkg/version.nim @@ -1 +1 @@ -const PM_API_VERSION* = "0.5.0" +const PM_API_VERSION* = "0.6.0" diff --git a/web/package.json b/web/package.json index 5d436fd..b11e987 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "personal-measure-web", - "version": "0.5.0", + "version": "0.6.0", "private": true, "scripts": { "serve": "vue-cli-service serve",