| Class | Sequel::Postgres::IntervalDatabaseMethods::Parser |
| In: |
lib/sequel/extensions/pg_interval.rb
|
| Parent: | Object |
Creates callable objects that convert strings into ActiveSupport::Duration instances.
Parse the interval input string into an ActiveSupport::Duration instance.
# File lib/sequel/extensions/pg_interval.rb, line 65
65: def call(string)
66: raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string)
67:
68: value = 0
69: parts = []
70:
71: if v = matches[1]
72: v = v.to_i
73: value += 31557600 * v
74: parts << [:years, v]
75: end
76: if v = matches[2]
77: v = v.to_i
78: value += 2592000 * v
79: parts << [:months, v]
80: end
81: if v = matches[3]
82: v = v.to_i
83: value += 86400 * v
84: parts << [:days, v]
85: end
86: if matches[5]
87: seconds = matches[5].to_i * 3600 + matches[6].to_i * 60
88: seconds += matches[8] ? matches[7].to_f : matches[7].to_i
89: seconds *= -1 if matches[4] == '-'
90: value += seconds
91: parts << [:seconds, seconds]
92: elsif matches[9] || matches[10] || matches[11]
93: seconds = 0
94: if v = matches[9]
95: seconds += v.to_i * 3600
96: end
97: if v = matches[10]
98: seconds += v.to_i * 60
99: end
100: if v = matches[11]
101: seconds += matches[12] ? v.to_f : v.to_i
102: end
103: value += seconds
104: parts << [:seconds, seconds]
105: end
106:
107: ActiveSupport::Duration.new(value, parts)
108: end