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