Class DataMapper::Adapters::Sql::Mappings::Column
In: lib/data_mapper/adapters/sql/mappings/column.rb
lib/data_mapper/adapters/sql/mappings/column.rb
Parent: Object

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

Methods

Attributes

check  [R] 
check  [R] 
default  [R] 
default  [R] 
index  [W] 
index  [W] 
lazy  [W] 
lazy  [W] 
name  [R] 
name  [R] 
options  [RW] 
options  [RW] 
ordinal  [R] 
ordinal  [R] 
size  [R] 
size  [R] 
table  [RW] 
table  [RW] 
type  [R] 
type  [R] 
unique  [W] 
unique  [W] 

Public Class methods

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 13
13:           def initialize(adapter, table, name, type, ordinal, options = {})
14:             @adapter = adapter
15:             @table = table
16:             @name, self.type, @options = name.to_sym, type, options
17:             @ordinal = ordinal
18:             parse_options!
19:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 13
13:           def initialize(adapter, table, name, type, ordinal, options = {})
14:             @adapter = adapter
15:             @table = table
16:             @name, self.type, @options = name.to_sym, type, options
17:             @ordinal = ordinal
18:             parse_options!
19:           end

Public Instance methods

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 228
228:           def <=>(other)
229:             ordinal <=> other.ordinal
230:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 228
228:           def <=>(other)
229:             ordinal <=> other.ordinal
230:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 166
166:           def alter!
167:             flush_sql_caches!
168:             @adapter.connection do |db|
169:               command = db.create_command(to_alter_sql)
170:               command.execute_non_query
171:             end
172:             true
173:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 166
166:           def alter!
167:             flush_sql_caches!
168:             @adapter.connection do |db|
169:               command = db.create_command(to_alter_sql)
170:               command.execute_non_query
171:             end
172:             true
173:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 109
109:           def column_name
110:             @column_name || (@column_name = (@options.has_key?(:column) ? @options[:column].to_s : name.to_s.gsub(/\?$/, '')).freeze)
111:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 109
109:           def column_name
110:             @column_name || (@column_name = (@options.has_key?(:column) ? @options[:column].to_s : name.to_s.gsub(/\?$/, '')).freeze)
111:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 144
144:           def create!
145:             @table.columns << self
146:             flush_sql_caches!
147:             
148:             @adapter.connection do |db|
149:               command = db.create_command(to_create_sql)
150:               command.execute_non_query
151:             end
152:             true
153:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 144
144:           def create!
145:             @table.columns << self
146:             flush_sql_caches!
147:             
148:             @adapter.connection do |db|
149:               command = db.create_command(to_create_sql)
150:               command.execute_non_query
151:             end
152:             true
153:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 92
92:           def default=(value)
93:             self.flush_sql_caches!
94:             @default = value
95:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 92
92:           def default=(value)
93:             self.flush_sql_caches!
94:             @default = value
95:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 46
46:           def defaulted?() instance_variables.include?("@default") end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 46
46:           def defaulted?() instance_variables.include?("@default") end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 155
155:           def drop!
156:             @table.columns.delete(self)
157:             flush_sql_caches!
158:             
159:             @adapter.connection do |db|
160:               command = db.create_command(to_drop_sql)
161:               command.execute_non_query
162:             end
163:             true
164:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 155
155:           def drop!
156:             @table.columns.delete(self)
157:             flush_sql_caches!
158:             
159:             @adapter.connection do |db|
160:               command = db.create_command(to_drop_sql)
161:               command.execute_non_query
162:             end
163:             true
164:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 236
236:           def eql?(other)
237:             name == other.name
238:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 236
236:           def eql?(other)
237:             name == other.name
238:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 232
232:           def hash
233:             @hash || @hash = to_sql(true).hash
234:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 232
232:           def hash
233:             @hash || @hash = to_sql(true).hash
234:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 88
88:           def index?
89:                 @index
90:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 88
88:           def index?
89:                 @index
90:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 128
128:           def inspect
129:             "#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
130:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 128
128:           def inspect
129:             "#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
130:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 101
101:           def instance_variable_name
102:             @instance_variable_name || (@instance_variable_name = "@#{@name.to_s.gsub(/\?$/, '')}".freeze)
103:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 101
101:           def instance_variable_name
102:             @instance_variable_name || (@instance_variable_name = "@#{@name.to_s.gsub(/\?$/, '')}".freeze)
103:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 76
76:           def key?
77:             @key
78:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 76
76:           def key?
77:             @key
78:           end

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.

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 68
68:           def lazy?
69:             @lazy
70:           end

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.

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 68
68:           def lazy?
69:             @lazy
70:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 60
60:           def name=(value)
61:             flush_sql_caches!
62:             @name = value
63:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 60
60:           def name=(value)
61:             flush_sql_caches!
62:             @name = value
63:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 72
72:           def nullable?
73:             @nullable
74:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 72
72:           def nullable?
73:             @nullable
74:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 21
21:           def parse_options!
22:             @key = @options[:key] == true || @options[:serial] == true
23:             @nullable = @options.has_key?(:nullable) ? @options[:nullable] : !@key
24:             @lazy = @options.has_key?(:lazy) ? @options[:lazy] : (@type == :text && !@key)
25:             @serial = @options[:serial] == true
26:             @default = @options[:default]
27:             
28:             @unique = if @options[:index] == :unique then @options.delete(:index); true else false end
29:             @index = @options[:index]
30:             @check = @options[:check] # only for postgresql
31:             
32:             @size = if @options.has_key?(:size)
33:               @options[:size]
34:             elsif @options.has_key?(:length)
35:               @options[:length]
36:             else
37:               case type
38:                 when :integer then 11
39:                 when :string, :class then 50
40:                 else nil
41:               end
42:             end
43:             @size = @size.last if @size.is_a?(Range)
44:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 21
21:           def parse_options!
22:             @key = @options[:key] == true || @options[:serial] == true
23:             @nullable = @options.has_key?(:nullable) ? @options[:nullable] : !@key
24:             @lazy = @options.has_key?(:lazy) ? @options[:lazy] : (@type == :text && !@key)
25:             @serial = @options[:serial] == true
26:             @default = @options[:default]
27:             
28:             @unique = if @options[:index] == :unique then @options.delete(:index); true else false end
29:             @index = @options[:index]
30:             @check = @options[:check] # only for postgresql
31:             
32:             @size = if @options.has_key?(:size)
33:               @options[:size]
34:             elsif @options.has_key?(:length)
35:               @options[:length]
36:             else
37:               case type
38:                 when :integer then 11
39:                 when :string, :class then 50
40:                 else nil
41:               end
42:             end
43:             @size = @size.last if @size.is_a?(Range)
44:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 175
175:           def rename!(new_name)
176:             old_name = name # Store the old_name
177:             
178:             new_column = @table.add_column(new_name, self.type, self.options.merge(:ordinal => self.ordinal))
179:             
180:             # Create the new column
181:             new_column.create!
182:             
183:             # Copy the data from one column to the other.
184:             @adapter.connection do |db|
185:               command = db.create_command "UPDATE \#{@table.to_sql} SET\n\#{new_column.to_sql} = \#{to_sql}\n".compress_lines
186:               command.execute_non_query
187:             end
188:             
189:             self.drop!
190:             new_column
191:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 175
175:           def rename!(new_name)
176:             old_name = name # Store the old_name
177:             
178:             new_column = @table.add_column(new_name, self.type, self.options.merge(:ordinal => self.ordinal))
179:             
180:             # Create the new column
181:             new_column.create!
182:             
183:             # Copy the data from one column to the other.
184:             @adapter.connection do |db|
185:               command = db.create_command "UPDATE \#{@table.to_sql} SET\n\#{new_column.to_sql} = \#{to_sql}\n".compress_lines
186:               command.execute_non_query
187:             end
188:             
189:             self.drop!
190:             new_column
191:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 80
80:           def serial?
81:             @serial
82:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 80
80:           def serial?
81:             @serial
82:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 123
123:           def size=(val)
124:             self.flush_sql_caches!
125:             @size = val
126:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 123
123:           def size=(val)
124:             self.flush_sql_caches!
125:             @size = val
126:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 136
136:           def to_alter_sql
137:             "ALTER TABLE " <<  table.to_sql << " MODIFY COLUMN " << to_long_form
138:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 136
136:           def to_alter_sql
137:             "ALTER TABLE " <<  table.to_sql << " MODIFY COLUMN " << to_long_form
138:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 132
132:           def to_create_sql            
133:             "ALTER TABLE " <<  table.to_sql << " ADD " << to_long_form
134:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 132
132:           def to_create_sql            
133:             "ALTER TABLE " <<  table.to_sql << " ADD " << to_long_form
134:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 140
140:           def to_drop_sql
141:             "ALTER TABLE " <<  table.to_sql << " DROP COLUMN " << to_sql
142:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 140
140:           def to_drop_sql
141:             "ALTER TABLE " <<  table.to_sql << " DROP COLUMN " << to_sql
142:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 197
197:           def to_long_form
198:             @to_long_form || begin
199:               @to_long_form = "#{to_sql} #{type_declaration}"
200:               
201:               unless nullable? || not_null_declaration.blank?
202:                 @to_long_form << " #{not_null_declaration}"
203:               end
204:               
205:               # NOTE: We only do inline PRIMARY KEY declarations
206:               # if the column is also serial since we know
207:               # "there can be only one".
208:               if key? && serial? && !primary_key_declaration.blank?
209:                 @to_long_form << " #{primary_key_declaration}"
210:               end
211:               
212:               if serial? && !serial_declaration.blank?
213:                 @to_long_form << " #{serial_declaration}"
214:               end
215:               
216:               unless default.nil? || (value = default_declaration).blank?
217:                 @to_long_form << " #{value}"
218:               end
219:               
220:               if unique? && !unique_declaration.blank?
221:                 @to_long_form << " #{unique_declaration}"
222:               end
223:               
224:               @to_long_form
225:             end
226:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 197
197:           def to_long_form
198:             @to_long_form || begin
199:               @to_long_form = "#{to_sql} #{type_declaration}"
200:               
201:               unless nullable? || not_null_declaration.blank?
202:                 @to_long_form << " #{not_null_declaration}"
203:               end
204:               
205:               # NOTE: We only do inline PRIMARY KEY declarations
206:               # if the column is also serial since we know
207:               # "there can be only one".
208:               if key? && serial? && !primary_key_declaration.blank?
209:                 @to_long_form << " #{primary_key_declaration}"
210:               end
211:               
212:               if serial? && !serial_declaration.blank?
213:                 @to_long_form << " #{serial_declaration}"
214:               end
215:               
216:               unless default.nil? || (value = default_declaration).blank?
217:                 @to_long_form << " #{value}"
218:               end
219:               
220:               if unique? && !unique_declaration.blank?
221:                 @to_long_form << " #{unique_declaration}"
222:               end
223:               
224:               @to_long_form
225:             end
226:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 105
105:           def to_s
106:             @name.to_s
107:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 105
105:           def to_s
106:             @name.to_s
107:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 113
113:           def to_sql(include_table_name = false)
114:             if include_table_name
115:               @to_sql_with_table_name || @to_sql_with_table_name = begin
116:                 (@table.to_sql + '.' + @adapter.quote_column_name(column_name)).freeze
117:               end
118:             else
119:               @to_sql || (@to_sql = @adapter.quote_column_name(column_name).freeze)
120:             end
121:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 113
113:           def to_sql(include_table_name = false)
114:             if include_table_name
115:               @to_sql_with_table_name || @to_sql_with_table_name = begin
116:                 (@table.to_sql + '.' + @adapter.quote_column_name(column_name)).freeze
117:               end
118:             else
119:               @to_sql || (@to_sql = @adapter.quote_column_name(column_name).freeze)
120:             end
121:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 97
97:           def to_sym
98:             @name
99:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 97
97:           def to_sym
98:             @name
99:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 48
48:           def type=(value)
49:             self.flush_sql_caches!
50:             @type = value
51:             (class << self; self end).class_eval "def type_cast_value(value)\n@adapter.type_cast_\#{@type}(value)\nend\n"
52:             @type
53:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 48
48:           def type=(value)
49:             self.flush_sql_caches!
50:             @type = value
51:             (class << self; self end).class_eval "def type_cast_value(value)\n@adapter.type_cast_\#{@type}(value)\nend\n"
52:             @type
53:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 84
84:           def unique?
85:                 @unique
86:           end

[Source]

    # File lib/data_mapper/adapters/sql/mappings/column.rb, line 84
84:           def unique?
85:                 @unique
86:           end

Protected Instance methods

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 264
264:           def default_declaration
265:             @adapter.connection { |db| db.create_command("DEFAULT ?").escape_sql([default]) }
266:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 264
264:           def default_declaration
265:             @adapter.connection { |db| db.create_command("DEFAULT ?").escape_sql([default]) }
266:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 268
268:           def flush_sql_caches!
269:             @to_long_form = nil
270:             @to_sql = nil
271:             @to_sql_with_table_name = nil
272:             @column_name = nil
273:             @table.flush_sql_caches!(false)
274:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 268
268:           def flush_sql_caches!
269:             @to_long_form = nil
270:             @to_sql = nil
271:             @to_sql_with_table_name = nil
272:             @column_name = nil
273:             @table.flush_sql_caches!(false)
274:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 252
252:           def not_null_declaration
253:             "NOT NULL"
254:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 252
252:           def not_null_declaration
253:             "NOT NULL"
254:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 242
242:           def primary_key_declaration
243:             "PRIMARY KEY"
244:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 242
242:           def primary_key_declaration
243:             "PRIMARY KEY"
244:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 256
256:           def serial_declaration
257:             "AUTO_INCREMENT"
258:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 256
256:           def serial_declaration
257:             "AUTO_INCREMENT"
258:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 246
246:           def type_declaration
247:             sql = "#{@adapter.class::TYPES[type] || type}"
248:             sql << "(#{size})" unless size.nil?
249:             sql
250:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 246
246:           def type_declaration
247:             sql = "#{@adapter.class::TYPES[type] || type}"
248:             sql << "(#{size})" unless size.nil?
249:             sql
250:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 260
260:           def unique_declaration
261:                 "UNIQUE"
262:           end

[Source]

     # File lib/data_mapper/adapters/sql/mappings/column.rb, line 260
260:           def unique_declaration
261:                 "UNIQUE"
262:           end

[Validate]