Skip to content

Commit 02a5f5c

Browse files
author
Andrey Oskin
committed
fix: introduce _tryparse (JuliaDatabases#265)
1 parent 73c22dc commit 02a5f5c

File tree

1 file changed

+46
-32
lines changed

1 file changed

+46
-32
lines changed

src/parsing.jl

+46-32
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,39 @@ Base.convert(::Type{String}, pqv::PQValue) = String(pqv)
111111
Base.length(pqv::PQValue) = length(string_view(pqv))
112112
Base.lastindex(pqv::PQValue) = lastindex(string_view(pqv))
113113

114+
115+
# Julia bug override, see https://github.com/iamed2/LibPQ.jl/issues/265
116+
# and https://github.com/iamed2/LibPQ.jl/pull/248 for more details
117+
function _tryparse(::Type{T}, str, timeformat) where T
118+
@static if v"1.6.6" <= VERSION < v"1.7.0" || VERSION > v"1.7.2"
119+
return tryparse(T, str, timeformat)
120+
else
121+
try
122+
return tryparse(T, str, timeformat)
123+
catch err
124+
if !(err isa InexactError)
125+
rethrow(err)
126+
end
127+
end
128+
return nothing
129+
end
130+
end
131+
132+
function _tryparse(::Type{T}, str) where T
133+
@static if v"1.6.6" <= VERSION < v"1.7.0" || VERSION > v"1.7.2"
134+
return tryparse(T, str)
135+
else
136+
try
137+
return tryparse(T, str)
138+
catch err
139+
if !(err isa InexactError)
140+
rethrow(err)
141+
end
142+
end
143+
return nothing
144+
end
145+
end
146+
114147
# Fallback, because Base requires string iteration state to be indices into the string.
115148
# In an ideal world, PQValue would be an AbstractString and this particular method would
116149
# not be necessary.
@@ -259,23 +292,11 @@ function pqparse(::Type{DateTime}, str::AbstractString)
259292
parsed = _tryparse_datetime_inf(DateTime, str)
260293
isnothing(parsed) || return parsed
261294

262-
# Please, do not remove @static, see https://github.com/iamed2/LibPQ.jl/issues/265
263-
# for more details
264-
@static if v"1.6.6" <= VERSION < v"1.7.0" || VERSION > v"1.7.2"
265-
parsed = tryparse(DateTime, str, TIMESTAMP_FORMAT)
266-
isnothing(parsed) || return parsed
295+
parsed = _tryparse(DateTime, str, TIMESTAMP_FORMAT)
296+
isnothing(parsed) || return parsed
267297

268-
return parse(DateTime, _trunc_seconds(str), TIMESTAMP_FORMAT)
269-
else
270-
try
271-
return parse(DateTime, str, TIMESTAMP_FORMAT)
272-
catch err
273-
if !(err isa InexactError)
274-
rethrow(err)
275-
end
276-
end
277-
return parse(DateTime, _trunc_seconds(str), TIMESTAMP_FORMAT)
278-
end
298+
# If there's an error we want to see it here
299+
return parse(DateTime, _trunc_seconds(str), TIMESTAMP_FORMAT)
279300
end
280301

281302
# ISO, YMD
@@ -292,10 +313,11 @@ function pqparse(::Type{ZonedDateTime}, str::AbstractString)
292313
isnothing(parsed) || return parsed
293314

294315
for fmt in TIMESTAMPTZ_FORMATS[1:(end - 1)]
295-
parsed = tryparse(ZonedDateTime, str, fmt)
316+
parsed = _tryparse(ZonedDateTime, str, fmt)
296317
isnothing(parsed) || return parsed
297318
end
298319

320+
# If there's an error we want to see it here
299321
return parse(ZonedDateTime, _trunc_seconds(str), TIMESTAMPTZ_FORMATS[end])
300322
end
301323

@@ -307,9 +329,10 @@ function pqparse(::Type{UTCDateTime}, str::AbstractString)
307329
# which is the default
308330
str = replace(str, "+00" => "")
309331

310-
parsed = tryparse(UTCDateTime, str, TIMESTAMP_FORMAT)
332+
parsed = _tryparse(UTCDateTime, str, TIMESTAMP_FORMAT)
311333
isnothing(parsed) || return parsed
312334

335+
# If there's an error we want to see it here
313336
return parse(UTCDateTime, _trunc_seconds(str), TIMESTAMP_FORMAT)
314337
end
315338

@@ -328,20 +351,11 @@ end
328351

329352
_DEFAULT_TYPE_MAP[:time] = Time
330353
function pqparse(::Type{Time}, str::AbstractString)
331-
@static if v"1.6.6" <= VERSION < v"1.7.0" || VERSION > v"1.7.2"
332-
result = tryparse(Time, str)
333-
# If there's an error we want to see it here
334-
return isnothing(result) ? parse(Time, _trunc_seconds(str)) : result
335-
else
336-
try
337-
return parse(Time, str)
338-
catch err
339-
if !(err isa InexactError)
340-
rethrow(err)
341-
end
342-
end
343-
return parse(Time, _trunc_seconds(str))
344-
end
354+
parsed = _tryparse(Time, str)
355+
isnothing(parsed) || return parsed
356+
357+
# If there's an error we want to see it here
358+
return parse(Time, _trunc_seconds(str))
345359
end
346360

347361
# InfExtendedTime support for Dates.TimeType

0 commit comments

Comments
 (0)