bit.rb 1.0 KB
Newer Older
1 2 3 4
module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module OID # :nodoc:
5
        class Bit < Type::Value # :nodoc:
6 7 8 9
          def type
            :bit
          end

S
Sean Griffin 已提交
10
          def cast(value)
11
            if ::String === value
12 13 14 15 16 17
              case value
              when /^0x/i
                value[2..-1].hex.to_s(2) # Hexadecimal notation
              else
                value                    # Bit-string notation
              end
18 19 20 21
            else
              value
            end
          end
22

23
          def serialize(value)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
            Data.new(super) if value
          end

          class Data
            def initialize(value)
              @value = value
            end

            def to_s
              value
            end

            def binary?
              /\A[01]*\Z/ === value
            end

            def hex?
              /\A[0-9A-F]*\Z/i === value
            end

            protected

            attr_reader :value
          end
48 49 50 51 52
        end
      end
    end
  end
end