Class: Baza::Driver::Pg::Columns

Inherits:
Object
  • Object
show all
Defined in:
lib/baza/driver/pg/columns.rb

Constant Summary collapse

DATA_SQL_ALLOWED_KEYS =
[:type, :maxlength, :name, :primarykey, :autoincr, :default, :comment, :after, :first, :storage, :null, :renames].freeze

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Columns

Returns a new instance of Columns.



2
3
4
# File 'lib/baza/driver/pg/columns.rb', line 2

def initialize(args)
  @db = args.fetch(:db)
end

Instance Method Details

#data_sql(data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/baza/driver/pg/columns.rb', line 7

def data_sql(data)
  data.each_key do |key|
    raise "Invalid key: '#{key}' (#{key.class.name})." unless DATA_SQL_ALLOWED_KEYS.include?(key)
  end

  maxlength = data[:maxlength]

  raise "No type given." unless data[:type]
  type = data[:type].to_sym
  type = :timestamp if type == :datetime

  if type == :int && data[:autoincr]
    type = :serial
    maxlength = nil
  end

  if type == :int
    type = :integer
    maxlength = nil
  end

  if type == :tinyint
    type = :smallint
    maxlength = nil
  end

  data[:maxlength] = 255 if type == :varchar && !data.key?(:maxlength)

  sql = "#{@db.sep_col}#{@db.escape_column(data.fetch(:name))}#{@db.sep_col} #{type}"
  sql << "(#{maxlength})" if maxlength
  sql << " PRIMARY KEY" if data[:primarykey]
  sql << " NOT NULL" if data.key?(:null) && !data[:null]

  if data.key?(:default_func)
    sql << " DEFAULT #{data[:default_func]}"
  elsif data.key?(:default) && data[:default]
    sql << " DEFAULT #{@db.sqlval(data.fetch(:default))}"
  end

  sql << " COMMENT '#{@db.escape(data.fetch(:comment))}'" if data.key?(:comment)
  sql << " AFTER #{@db.sep_col}#{@db.escape_column(data.fetch(:after))}#{@db.sep_col}" if data[:after] && !data[:first]
  sql << " FIRST" if data[:first]
  sql << " STORAGE #{data[:storage].to_s.upcase}" if data[:storage]

  sql
end