# Some of it yanked from Rails

# Copyright (c) 2004-2009 David Heinemeier Hansson
# 
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# 
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

module Tramp
  class Column < Struct.new(:name, :default, :sql_type, :null)
    attr_reader :type

    def initialize(name, default, sql_type, null)
      super
      @type = simplified_type(sql_type)
    end

    private

    def simplified_type(field_type)
      case field_type
        when /int/i
          :integer
        when /float|double/i
          :float
        when /decimal|numeric|number/i
          extract_scale(field_type) == 0 ? :integer : :decimal
        when /datetime/i
          :datetime
        when /timestamp/i
          :timestamp
        when /time/i
          :time
        when /date/i
          :date
        when /clob/i, /text/i
          :text
        when /blob/i, /binary/i
          :binary
        when /char/i, /string/i
          :string
        when /boolean/i
          :boolean
      end
    end

    def extract_scale(sql_type)
      case sql_type
        when /^(numeric|decimal|number)\((\d+)\)/i then 0
        when /^(numeric|decimal|number)\((\d+)(,(\d+))\)/i then $4.to_i
      end
    end

  end
end
