Class: DataMapper::Adapters::Sql::Mappings::Column

Inherits:
Object
  • Object
show all
Defined in:
lib/data_mapper/adapters/sql/mappings/column.rb

Overview

TODO: There are of course many more options to add here. Ordinal, Length/Size, Nullability are just a few.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(adapter, table, name, type, ordinal, options = {}) ⇒ Column

Returns a new instance of Column.



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
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 13

def initialize(adapter, table, name, type, ordinal, options = {})
  @adapter = adapter
  @table = table
  @name, self.type, @options = name.to_sym, type, options
  @ordinal = ordinal
  
  @key = @options[:key] == true || @options[:serial] == true
  @nullable = @options.has_key?(:nullable) ? @options[:nullable] : !@key
  @lazy = @options.has_key?(:lazy) ? @options[:lazy] : (@type == :text && !@key)
  @serial = @options[:serial] == true
  @default = @options[:default]
  @unique = @options.has_value?(:unique)
  @index = @options[:index]
  @check = @options[:check] # only for postgresql
  
  @size = if @options.has_key?(:size)
    @options[:size]
  elsif @options.has_key?(:length)
    @options[:length]
  else
    case type
      when :integer then 11
      when :string, :class then 50
      else nil
    end
  end
end

Instance Attribute Details

#checkObject (readonly)

Returns the value of attribute check.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def check
  @check
end

#defaultObject

Returns the value of attribute default.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def default
  @default
end

#index=(value) ⇒ Object (writeonly)

Sets the attribute index

Parameters:

  • value

    the value to set the attribute index to.



10
11
12
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 10

def index=(value)
  @index = value
end

#lazy=(value) ⇒ Object (writeonly)

Sets the attribute lazy

Parameters:

  • value

    the value to set the attribute lazy to.



10
11
12
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 10

def lazy=(value)
  @lazy = value
end

#nameObject

Returns the value of attribute name.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def name
  @name
end

#optionsObject

Returns the value of attribute options.



11
12
13
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 11

def options
  @options
end

#ordinalObject (readonly)

Returns the value of attribute ordinal.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def ordinal
  @ordinal
end

#sizeObject

Returns the value of attribute size.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def size
  @size
end

#tableObject

Returns the value of attribute table.



11
12
13
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 11

def table
  @table
end

#typeObject

Returns the value of attribute type.



9
10
11
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 9

def type
  @type
end

Instance Method Details

#<=>(other) ⇒ Object



222
223
224
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 222

def <=>(other)
  ordinal <=> other.ordinal
end

#alter!Object



158
159
160
161
162
163
164
165
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 158

def alter!
  flush_sql_caches!
  @adapter.connection do |db|
    command = db.create_command(to_alter_sql)
    command.execute_non_query
  end
  true
end

#column_nameObject



101
102
103
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 101

def column_name
  @column_name || (@column_name = (@options.has_key?(:column) ? @options[:column].to_s : name.to_s.gsub(/\?$/, '')).freeze)
end

#create!Object



136
137
138
139
140
141
142
143
144
145
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 136

def create!
  @table.columns << self
  flush_sql_caches!
  
  @adapter.connection do |db|
    command = db.create_command(to_create_sql)
    command.execute_non_query
  end
  true
end

#drop!Object



147
148
149
150
151
152
153
154
155
156
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 147

def drop!
  @table.columns.delete(self)
  flush_sql_caches!
  
  @adapter.connection do |db|
    command = db.create_command(to_drop_sql)
    command.execute_non_query
  end
  true
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


230
231
232
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 230

def eql?(other)
  name == other.name
end

#hashObject



226
227
228
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 226

def hash
  @hash || @hash = to_sql(true).hash
end

#index?Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 80

def index?
	@index
end

#inspectObject



120
121
122
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 120

def inspect
  "#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
end

#instance_variable_nameObject



93
94
95
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 93

def instance_variable_name
  @instance_variable_name || (@instance_variable_name = "@#{@name.to_s.gsub(/\?$/, '')}".freeze)
end

#key?Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 68

def key?
  @key
end

#lazy?Boolean

Determines if the field should be lazy loaded. You can set this explicitly, or accept the default, which is false for all but text fields.

Returns:

  • (Boolean)


60
61
62
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 60

def lazy?
  @lazy
end

#nullable?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 64

def nullable?
  @nullable
end

#rename!(new_name) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 167

def rename!(new_name)
  old_name = name # Store the old_name
  
  new_column = @table.add_column(new_name, self.type, self.options)
  
  # Create the new column
  new_column.create!
  
  # Copy the data from one column to the other.
  @adapter.connection do |db|
    command = db.create_command <<-EOS.compress_lines
      UPDATE #{@table.to_sql} SET
      #{new_column.to_sql} = #{to_sql}
    EOS
    command.execute_non_query
  end
  
  # Swap column names
  self.name, new_column.name = new_column.name, self.name
  # Drop the old column
  new_column.drop!
  true
end

#serial?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 72

def serial?
  @serial
end

#to_alter_sqlObject



128
129
130
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 128

def to_alter_sql
  "ALTER TABLE " <<  table.to_sql << " MODIFY COLUMN " << to_long_form
end

#to_create_sqlObject



124
125
126
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 124

def to_create_sql            
  "ALTER TABLE " <<  table.to_sql << " ADD " << to_long_form
end

#to_drop_sqlObject



132
133
134
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 132

def to_drop_sql
  "ALTER TABLE " <<  table.to_sql << " DROP COLUMN " << to_sql
end

#to_long_formObject



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 191

def to_long_form
  @to_long_form || begin
    @to_long_form = "#{to_sql} #{type_declaration}"
    
    unless nullable? || not_null_declaration.blank?
      @to_long_form << " #{not_null_declaration}"
    end
    
    # NOTE: We only do inline PRIMARY KEY declarations
    # if the column is also serial since we know
    # "there can be only one".
    if key? && serial? && !primary_key_declaration.blank?
      @to_long_form << " #{primary_key_declaration}"
    end
    
    if serial? && !serial_declaration.blank?
      @to_long_form << " #{serial_declaration}"
    end
    
    unless default.nil? || (value = default_declaration).blank?
      @to_long_form << " #{value}"
    end
    
    if unique? && !unique_declaration.blank?
      @to_long_form << " #{unique_declaration}"
    end
    
    @to_long_form
  end
end

#to_sObject



97
98
99
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 97

def to_s
  @name.to_s
end

#to_sql(include_table_name = false) ⇒ Object



105
106
107
108
109
110
111
112
113
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 105

def to_sql(include_table_name = false)
  if include_table_name
    @to_sql_with_table_name || @to_sql_with_table_name = begin
      (@table.to_sql + '.' + @adapter.quote_column_name(column_name)).freeze
    end
  else
    @to_sql || (@to_sql = @adapter.quote_column_name(column_name).freeze)
  end
end

#to_symObject



89
90
91
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 89

def to_sym
  @name
end

#unique?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/data_mapper/adapters/sql/mappings/column.rb', line 76

def unique?
	@unique
end