aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/type/integer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/type/integer.rb')
-rw-r--r--activerecord/lib/active_record/type/integer.rb21
1 files changed, 20 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/type/integer.rb b/activerecord/lib/active_record/type/integer.rb
index 08477d1303..2b0f0b2734 100644
--- a/activerecord/lib/active_record/type/integer.rb
+++ b/activerecord/lib/active_record/type/integer.rb
@@ -15,9 +15,28 @@ module ActiveRecord
case value
when true then 1
when false then 0
- else value.to_i rescue nil
+ else
+ result = value.to_i rescue nil
+ ensure_below_max(result) if result
+ result
end
end
+
+ def ensure_below_max(value)
+ if value > max_value
+ raise RangeError, "#{value} is too large for #{self.class} with limit #{limit || 4}"
+ end
+ end
+
+ def max_value
+ @max_value = determine_max_value unless defined?(@max_value)
+ @max_value
+ end
+
+ def determine_max_value
+ limit = self.limit || 4
+ 2 << (limit * 8 - 1) # 8 bits per byte with one bit for sign
+ end
end
end
end