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