datamapper 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/example.rb +5 -5
- data/lib/data_mapper/adapters/abstract_adapter.rb +2 -2
- data/lib/data_mapper/adapters/data_object_adapter.rb +141 -147
- data/lib/data_mapper/adapters/mysql_adapter.rb +14 -1
- data/lib/data_mapper/adapters/postgresql_adapter.rb +123 -18
- data/lib/data_mapper/adapters/sql/coersion.rb +21 -9
- data/lib/data_mapper/adapters/sql/commands/load_command.rb +36 -19
- data/lib/data_mapper/adapters/sql/mappings/column.rb +111 -17
- data/lib/data_mapper/adapters/sql/mappings/schema.rb +27 -0
- data/lib/data_mapper/adapters/sql/mappings/table.rb +256 -29
- data/lib/data_mapper/adapters/sqlite3_adapter.rb +93 -8
- data/lib/data_mapper/associations/belongs_to_association.rb +53 -54
- data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +157 -25
- data/lib/data_mapper/associations/has_many_association.rb +45 -15
- data/lib/data_mapper/associations/has_n_association.rb +79 -20
- data/lib/data_mapper/associations/has_one_association.rb +2 -2
- data/lib/data_mapper/associations/reference.rb +1 -1
- data/lib/data_mapper/auto_migrations.rb +40 -0
- data/lib/data_mapper/base.rb +201 -98
- data/lib/data_mapper/context.rb +16 -10
- data/lib/data_mapper/database.rb +22 -11
- data/lib/data_mapper/dependency_queue.rb +28 -0
- data/lib/data_mapper/embedded_value.rb +61 -17
- data/lib/data_mapper/property.rb +4 -0
- data/lib/data_mapper/support/active_record_impersonation.rb +13 -5
- data/lib/data_mapper/support/errors.rb +5 -0
- data/lib/data_mapper/support/serialization.rb +8 -4
- data/lib/data_mapper/validatable_extensions/errors.rb +12 -0
- data/lib/data_mapper/validatable_extensions/macros.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +62 -0
- data/lib/data_mapper/validatable_extensions/validation_base.rb +18 -0
- data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +43 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +28 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +15 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +7 -0
- data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +33 -0
- data/lib/data_mapper/validations.rb +20 -0
- data/lib/data_mapper.rb +39 -34
- data/performance.rb +24 -18
- data/plugins/dataobjects/do_rb +0 -0
- data/rakefile.rb +12 -2
- data/spec/active_record_impersonation_spec.rb +133 -0
- data/spec/acts_as_tree_spec.rb +25 -9
- data/spec/associations_spec.rb +124 -4
- data/spec/attributes_spec.rb +13 -0
- data/spec/auto_migrations_spec.rb +44 -0
- data/spec/base_spec.rb +189 -1
- data/spec/column_spec.rb +85 -7
- data/spec/conditions_spec.rb +2 -2
- data/spec/dependency_spec.rb +25 -0
- data/spec/embedded_value_spec.rb +123 -3
- data/spec/fixtures/animals.yaml +1 -0
- data/spec/fixtures/careers.yaml +5 -0
- data/spec/fixtures/comments.yaml +1 -0
- data/spec/fixtures/people.yaml +14 -9
- data/spec/fixtures/projects.yaml +4 -0
- data/spec/fixtures/sections.yaml +5 -0
- data/spec/fixtures/serializers.yaml +6 -0
- data/spec/fixtures/users.yaml +1 -0
- data/spec/load_command_spec.rb +5 -4
- data/spec/mock_adapter.rb +2 -2
- data/spec/models/animal.rb +2 -1
- data/spec/models/animals_exhibit.rb +2 -2
- data/spec/models/career.rb +6 -0
- data/spec/models/comment.rb +4 -0
- data/spec/models/exhibit.rb +4 -0
- data/spec/models/person.rb +3 -13
- data/spec/models/project.rb +1 -1
- data/spec/models/serializer.rb +3 -0
- data/spec/models/user.rb +4 -0
- data/spec/models/zoo.rb +8 -1
- data/spec/natural_key_spec.rb +36 -0
- data/spec/paranoia_spec.rb +36 -0
- data/spec/property_spec.rb +70 -0
- data/spec/schema_spec.rb +10 -2
- data/spec/serialization_spec.rb +6 -3
- data/spec/serialize_spec.rb +19 -0
- data/spec/single_table_inheritance_spec.rb +7 -1
- data/spec/spec_helper.rb +26 -8
- data/spec/table_spec.rb +33 -0
- data/spec/validates_confirmation_of_spec.rb +20 -4
- data/spec/validates_format_of_spec.rb +22 -8
- data/spec/validates_length_of_spec.rb +26 -13
- data/spec/validates_uniqueness_of_spec.rb +18 -5
- data/spec/validations_spec.rb +55 -10
- data/tasks/fixtures.rb +13 -7
- metadata +189 -153
- data/lib/data_mapper/validations/confirmation_validator.rb +0 -53
- data/lib/data_mapper/validations/contextual_validations.rb +0 -50
- data/lib/data_mapper/validations/format_validator.rb +0 -85
- data/lib/data_mapper/validations/formats/email.rb +0 -78
- data/lib/data_mapper/validations/generic_validator.rb +0 -22
- data/lib/data_mapper/validations/length_validator.rb +0 -76
- data/lib/data_mapper/validations/required_field_validator.rb +0 -41
- data/lib/data_mapper/validations/unique_validator.rb +0 -56
- data/lib/data_mapper/validations/validation_errors.rb +0 -37
- data/lib/data_mapper/validations/validation_helper.rb +0 -77
- data/plugins/dataobjects/REVISION +0 -1
- data/plugins/dataobjects/Rakefile +0 -9
- data/plugins/dataobjects/do.rb +0 -348
- data/plugins/dataobjects/do_mysql.rb +0 -212
- data/plugins/dataobjects/do_postgres.rb +0 -196
- data/plugins/dataobjects/do_sqlite3.rb +0 -157
- data/plugins/dataobjects/spec/do_spec.rb +0 -150
- data/plugins/dataobjects/spec/spec_helper.rb +0 -81
- data/plugins/dataobjects/swig_mysql/extconf.rb +0 -45
- data/plugins/dataobjects/swig_mysql/mysql_c.c +0 -16602
- data/plugins/dataobjects/swig_mysql/mysql_c.i +0 -67
- data/plugins/dataobjects/swig_mysql/mysql_supp.i +0 -46
- data/plugins/dataobjects/swig_postgres/extconf.rb +0 -29
- data/plugins/dataobjects/swig_postgres/postgres_c.c +0 -8185
- data/plugins/dataobjects/swig_postgres/postgres_c.i +0 -73
- data/plugins/dataobjects/swig_sqlite/extconf.rb +0 -9
- data/plugins/dataobjects/swig_sqlite/sqlite3_c.c +0 -4725
- data/plugins/dataobjects/swig_sqlite/sqlite_c.i +0 -168
- data/tasks/drivers.rb +0 -20
@@ -14,8 +14,8 @@ module DataMapper
|
|
14
14
|
class CoersionError < StandardError
|
15
15
|
end
|
16
16
|
|
17
|
-
TRUE_ALIASES = ['true'.freeze, 'TRUE'.freeze, '1'.freeze]
|
18
|
-
FALSE_ALIASES = [nil, '0'.freeze]
|
17
|
+
TRUE_ALIASES = ['true'.freeze, 'TRUE'.freeze, '1'.freeze, 1]
|
18
|
+
FALSE_ALIASES = [nil, '0'.freeze, 0]
|
19
19
|
|
20
20
|
def self.included(base)
|
21
21
|
base.const_set('TRUE_ALIASES', TRUE_ALIASES.dup)
|
@@ -27,20 +27,20 @@ module DataMapper
|
|
27
27
|
when TrueClass, FalseClass then raw_value
|
28
28
|
when *self::class::TRUE_ALIASES then true
|
29
29
|
when *self::class::FALSE_ALIASES then false
|
30
|
-
else "Can't type-cast #{
|
30
|
+
else "Can't type-cast #{raw_value.inspect} to a boolean"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
def type_cast_string(raw_value)
|
35
35
|
return nil if raw_value.blank?
|
36
36
|
# type-cast values should be immutable for memory conservation
|
37
|
-
raw_value
|
37
|
+
raw_value
|
38
38
|
end
|
39
39
|
|
40
40
|
def type_cast_text(raw_value)
|
41
41
|
return nil if raw_value.blank?
|
42
42
|
# type-cast values should be immutable for memory conservation
|
43
|
-
raw_value
|
43
|
+
raw_value
|
44
44
|
end
|
45
45
|
|
46
46
|
def type_cast_class(raw_value)
|
@@ -75,9 +75,10 @@ module DataMapper
|
|
75
75
|
return nil if raw_value.blank?
|
76
76
|
|
77
77
|
case raw_value
|
78
|
-
when
|
79
|
-
when
|
80
|
-
when
|
78
|
+
when "0000-00-00 00:00:00" then nil
|
79
|
+
when DateTime then raw_value
|
80
|
+
when Date then DateTime.new(raw_value) rescue nil
|
81
|
+
when String then DateTime::parse(raw_value) rescue nil
|
81
82
|
else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a datetime")
|
82
83
|
end
|
83
84
|
end
|
@@ -86,13 +87,23 @@ module DataMapper
|
|
86
87
|
return nil if raw_value.blank?
|
87
88
|
|
88
89
|
case raw_value
|
89
|
-
when Date then raw_value
|
90
|
+
when Date then raw_value
|
90
91
|
when DateTime, Time then Date::civil(raw_value.year, raw_value.month, raw_value.day)
|
91
92
|
when String then Date::parse(raw_value)
|
92
93
|
else raise CoersionError.new("Can't type-cast #{raw_value.inspect} to a date")
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
97
|
+
def type_cast_object(raw_value)
|
98
|
+
return nil if raw_value.blank?
|
99
|
+
|
100
|
+
begin
|
101
|
+
YAML.load(raw_value)
|
102
|
+
rescue
|
103
|
+
raise CoersionError.new("Can't type-cast #{raw_value.inspect} to an object")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
96
107
|
def type_cast_value(type, raw_value)
|
97
108
|
return nil if raw_value.blank?
|
98
109
|
|
@@ -106,6 +117,7 @@ module DataMapper
|
|
106
117
|
when :float then type_cast_float(raw_value)
|
107
118
|
when :datetime then type_cast_datetime(raw_value)
|
108
119
|
when :date then type_cast_date(raw_value)
|
120
|
+
when :object then type_cast_object(raw_value)
|
109
121
|
else
|
110
122
|
if respond_to?("type_cast_#{type}")
|
111
123
|
send("type_cast_#{type}", raw_value)
|
@@ -15,7 +15,7 @@ module DataMapper
|
|
15
15
|
@type_override_present = false
|
16
16
|
@type_override_index = nil
|
17
17
|
@type_override = nil
|
18
|
-
@
|
18
|
+
@database_context = load_command.database_context
|
19
19
|
@reload = load_command.reload?
|
20
20
|
@set = []
|
21
21
|
end
|
@@ -40,11 +40,13 @@ module DataMapper
|
|
40
40
|
def materialize(values)
|
41
41
|
|
42
42
|
instance_id = @key.type_cast_value(values[@key_index])
|
43
|
-
instance =
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
instance = create_instance(instance_id,
|
44
|
+
if @type_override_present
|
45
|
+
@type_override.type_cast_value(values[@type_override_index]) || @klass
|
46
|
+
else
|
47
|
+
@klass
|
48
|
+
end
|
49
|
+
)
|
48
50
|
|
49
51
|
@klass.callbacks.execute(:before_materialize, instance)
|
50
52
|
|
@@ -55,10 +57,16 @@ module DataMapper
|
|
55
57
|
# setting both the original_value, and the
|
56
58
|
# instance-variable through method chaining to avoid
|
57
59
|
# lots of extra short-lived local variables.
|
58
|
-
|
60
|
+
type_cast_value = instance.instance_variable_set(
|
59
61
|
column.instance_variable_name,
|
60
62
|
column.type_cast_value(values[index])
|
61
63
|
)
|
64
|
+
|
65
|
+
original_values[column.name] = case type_cast_value
|
66
|
+
when String, Date, Time then type_cast_value.dup
|
67
|
+
when column.type == :object then Marshal.dump(type_cast_value)
|
68
|
+
else type_cast_value
|
69
|
+
end
|
62
70
|
end
|
63
71
|
|
64
72
|
instance.instance_variable_set(:@loaded_set, @set)
|
@@ -67,6 +75,9 @@ module DataMapper
|
|
67
75
|
@klass.callbacks.execute(:after_materialize, instance)
|
68
76
|
|
69
77
|
return instance
|
78
|
+
|
79
|
+
rescue => e
|
80
|
+
raise MaterializationError.new("Failed to materialize row: #{values.inspect}\n#{e.to_yaml}")
|
70
81
|
end
|
71
82
|
|
72
83
|
def loaded_set
|
@@ -74,21 +85,23 @@ module DataMapper
|
|
74
85
|
end
|
75
86
|
|
76
87
|
private
|
77
|
-
|
78
|
-
|
79
|
-
|
88
|
+
|
89
|
+
class MaterializationError < StandardError; end
|
90
|
+
|
91
|
+
def create_instance(instance_id, instance_type)
|
92
|
+
instance = @database_context.identity_map.get(@klass, instance_id)
|
80
93
|
|
81
94
|
if instance.nil? || @reload
|
82
95
|
instance = instance_type.new() if instance.nil?
|
83
96
|
instance.instance_variable_set(:@__key, instance_id)
|
84
97
|
instance.instance_variable_set(:@new_record, false)
|
85
|
-
@
|
98
|
+
@database_context.identity_map.set(instance)
|
86
99
|
elsif instance.new_record?
|
87
100
|
instance.instance_variable_set(:@__key, instance_id)
|
88
101
|
instance.instance_variable_set(:@new_record, false)
|
89
102
|
end
|
90
103
|
|
91
|
-
instance.
|
104
|
+
instance.database_context = @database_context
|
92
105
|
|
93
106
|
return instance
|
94
107
|
end
|
@@ -113,10 +126,10 @@ module DataMapper
|
|
113
126
|
|
114
127
|
end
|
115
128
|
|
116
|
-
attr_reader :conditions, :
|
129
|
+
attr_reader :conditions, :database_context, :options
|
117
130
|
|
118
|
-
def initialize(adapter,
|
119
|
-
@adapter, @
|
131
|
+
def initialize(adapter, database_context, primary_class, options = {})
|
132
|
+
@adapter, @database_context, @primary_class = adapter, database_context, primary_class
|
120
133
|
|
121
134
|
# BEGIN: Partion out the options hash into general options,
|
122
135
|
# and conditions.
|
@@ -192,7 +205,7 @@ module DataMapper
|
|
192
205
|
# just skip that and go straight for the query.
|
193
206
|
unless reload? || @instance_id.blank? || @instance_id.is_a?(Array)
|
194
207
|
# If the id is for only a single record, attempt to find it.
|
195
|
-
if instance = @
|
208
|
+
if instance = @database_context.identity_map.get(@primary_class, @instance_id)
|
196
209
|
return [instance]
|
197
210
|
end
|
198
211
|
end
|
@@ -347,7 +360,7 @@ module DataMapper
|
|
347
360
|
when Symbol then
|
348
361
|
collector << ["#{primary_class_table[clause].to_sql(qualify_columns)} #{equality_operator(value)} ?", value]
|
349
362
|
when String then
|
350
|
-
collector << [clause, value]
|
363
|
+
collector << [clause, *value]
|
351
364
|
when Mappings::Column then
|
352
365
|
collector << ["#{clause.to_sql(qualify_columns)} #{equality_operator(value)} ?", value]
|
353
366
|
else raise "CAN HAS CRASH? #{clause.inspect}"
|
@@ -382,7 +395,7 @@ module DataMapper
|
|
382
395
|
@columns += included_columns
|
383
396
|
|
384
397
|
included_associations.each do |assoc|
|
385
|
-
@columns += assoc.
|
398
|
+
@columns += assoc.associated_columns
|
386
399
|
end
|
387
400
|
|
388
401
|
shallow_included_associations.each do |assoc|
|
@@ -486,7 +499,11 @@ module DataMapper
|
|
486
499
|
else
|
487
500
|
raise "Unable to parse conditions: #{x.inspect}" if x
|
488
501
|
end
|
489
|
-
|
502
|
+
|
503
|
+
if primary_class_table.paranoid?
|
504
|
+
conditions_hash[primary_class_table.paranoid_column.name] = nil
|
505
|
+
end
|
506
|
+
|
490
507
|
conditions_hash.each_pair do |key,value|
|
491
508
|
expression_to_sql(key, value, collection)
|
492
509
|
end
|
@@ -6,26 +6,37 @@ module DataMapper
|
|
6
6
|
# TODO: There are of course many more options to add here.
|
7
7
|
# Ordinal, Length/Size, Nullability are just a few.
|
8
8
|
class Column
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
attr_reader :type, :name
|
11
|
+
attr_accessor :table, :options
|
12
|
+
|
12
13
|
def initialize(adapter, table, name, type, ordinal, options = {})
|
13
14
|
@adapter = adapter
|
14
15
|
@table = table
|
15
|
-
@name,
|
16
|
+
@name, self.type, @options = name.to_sym, type, options
|
16
17
|
@ordinal = ordinal
|
17
18
|
|
18
|
-
@key =
|
19
|
+
@key = @options[:key] == true || @options[:serial] == true
|
19
20
|
@nullable = @options.has_key?(:nullable) ? @options[:nullable] : !@key
|
20
|
-
@lazy = @options.has_key?(:lazy) ? @options[:lazy] : @type == :text
|
21
|
-
@serial =
|
21
|
+
@lazy = @options.has_key?(:lazy) ? @options[:lazy] : (@type == :text && !@key)
|
22
|
+
@serial = @options[:serial] == true
|
22
23
|
@default = @options[:default]
|
23
|
-
|
24
|
+
end
|
25
|
+
|
26
|
+
def type=(value)
|
27
|
+
self.flush_sql_caches!
|
28
|
+
@type = value
|
24
29
|
(class << self; self end).class_eval <<-EOS
|
25
30
|
def type_cast_value(value)
|
26
|
-
@adapter.type_cast_#{type}(value)
|
31
|
+
@adapter.type_cast_#{@type}(value)
|
27
32
|
end
|
28
33
|
EOS
|
34
|
+
@type
|
35
|
+
end
|
36
|
+
|
37
|
+
def name=(value)
|
38
|
+
flush_sql_caches!
|
39
|
+
@name = value
|
29
40
|
end
|
30
41
|
|
31
42
|
def ordinal
|
@@ -59,6 +70,11 @@ module DataMapper
|
|
59
70
|
@default
|
60
71
|
end
|
61
72
|
|
73
|
+
def default=(value)
|
74
|
+
self.flush_sql_caches!
|
75
|
+
@default = value
|
76
|
+
end
|
77
|
+
|
62
78
|
def to_sym
|
63
79
|
@name
|
64
80
|
end
|
@@ -91,7 +107,7 @@ module DataMapper
|
|
91
107
|
return @size = @options[:length] if @options.has_key?(:length)
|
92
108
|
|
93
109
|
@size = case type
|
94
|
-
when :integer then
|
110
|
+
when :integer then 11
|
95
111
|
when :string, :class then 50
|
96
112
|
else nil
|
97
113
|
end
|
@@ -102,6 +118,73 @@ module DataMapper
|
|
102
118
|
"#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
|
103
119
|
end
|
104
120
|
|
121
|
+
def to_create_sql
|
122
|
+
"ALTER TABLE " << table.to_sql << " ADD " << to_long_form
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_alter_sql
|
126
|
+
"ALTER TABLE " << table.to_sql << " MODIFY COLUMN " << to_long_form
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_drop_sql
|
130
|
+
"ALTER TABLE " << table.to_sql << " DROP COLUMN " << to_sql
|
131
|
+
end
|
132
|
+
|
133
|
+
def create!
|
134
|
+
@table.columns << self
|
135
|
+
flush_sql_caches!
|
136
|
+
|
137
|
+
@adapter.connection do |db|
|
138
|
+
command = db.create_command(to_create_sql)
|
139
|
+
command.execute_non_query
|
140
|
+
end
|
141
|
+
true
|
142
|
+
end
|
143
|
+
|
144
|
+
def drop!
|
145
|
+
@table.columns.delete(self)
|
146
|
+
flush_sql_caches!
|
147
|
+
|
148
|
+
@adapter.connection do |db|
|
149
|
+
command = db.create_command(to_drop_sql)
|
150
|
+
command.execute_non_query
|
151
|
+
end
|
152
|
+
true
|
153
|
+
end
|
154
|
+
|
155
|
+
def alter!
|
156
|
+
flush_sql_caches!
|
157
|
+
@adapter.connection do |db|
|
158
|
+
command = db.create_command(to_alter_sql)
|
159
|
+
command.execute_non_query
|
160
|
+
end
|
161
|
+
true
|
162
|
+
end
|
163
|
+
|
164
|
+
def rename!(new_name)
|
165
|
+
old_name = name # Store the old_name
|
166
|
+
|
167
|
+
new_column = @table.add_column(new_name, self.type, self.options)
|
168
|
+
|
169
|
+
# Create the new column
|
170
|
+
new_column.create!
|
171
|
+
|
172
|
+
# Copy the data from one column to the other.
|
173
|
+
@adapter.connection do |db|
|
174
|
+
command = db.create_command <<-EOS.compress_lines
|
175
|
+
UPDATE #{@table.to_sql} SET
|
176
|
+
#{new_column.to_sql} = #{to_sql}
|
177
|
+
EOS
|
178
|
+
command.execute_non_query
|
179
|
+
end
|
180
|
+
|
181
|
+
# Swap column names
|
182
|
+
self.name, new_column.name = new_column.name, self.name
|
183
|
+
# Drop the old column
|
184
|
+
new_column.drop!
|
185
|
+
true
|
186
|
+
end
|
187
|
+
|
105
188
|
def to_long_form
|
106
189
|
@to_long_form || begin
|
107
190
|
@to_long_form = "#{to_sql} #{type_declaration}"
|
@@ -110,7 +193,10 @@ module DataMapper
|
|
110
193
|
@to_long_form << " #{not_null_declaration}"
|
111
194
|
end
|
112
195
|
|
113
|
-
|
196
|
+
# NOTE: We only do inline PRIMARY KEY declarations
|
197
|
+
# if the column is also serial since we know
|
198
|
+
# "there can be only one".
|
199
|
+
if key? && serial? && !primary_key_declaration.blank?
|
114
200
|
@to_long_form << " #{primary_key_declaration}"
|
115
201
|
end
|
116
202
|
|
@@ -118,8 +204,8 @@ module DataMapper
|
|
118
204
|
@to_long_form << " #{serial_declaration}"
|
119
205
|
end
|
120
206
|
|
121
|
-
|
122
|
-
@to_long_form << " #{
|
207
|
+
unless default.nil? || (value = default_declaration).blank?
|
208
|
+
@to_long_form << " #{value}"
|
123
209
|
end
|
124
210
|
|
125
211
|
@to_long_form
|
@@ -131,14 +217,14 @@ module DataMapper
|
|
131
217
|
end
|
132
218
|
|
133
219
|
def hash
|
134
|
-
|
220
|
+
@hash || @hash = to_sql(true).hash
|
135
221
|
end
|
136
222
|
|
137
223
|
def eql?(other)
|
138
224
|
name == other.name
|
139
225
|
end
|
140
226
|
|
141
|
-
|
227
|
+
protected
|
142
228
|
|
143
229
|
def primary_key_declaration
|
144
230
|
"PRIMARY KEY"
|
@@ -159,7 +245,15 @@ module DataMapper
|
|
159
245
|
end
|
160
246
|
|
161
247
|
def default_declaration
|
162
|
-
"DEFAULT
|
248
|
+
@adapter.connection { |db| db.create_command("DEFAULT ?").escape_sql([default]) }
|
249
|
+
end
|
250
|
+
|
251
|
+
def flush_sql_caches!
|
252
|
+
@to_long_form = nil
|
253
|
+
@to_sql = nil
|
254
|
+
@to_sql_with_table_name = nil
|
255
|
+
@column_name = nil
|
256
|
+
@table.flush_sql_caches!(false)
|
163
257
|
end
|
164
258
|
|
165
259
|
end
|
@@ -167,4 +261,4 @@ module DataMapper
|
|
167
261
|
end
|
168
262
|
end
|
169
263
|
end
|
170
|
-
end
|
264
|
+
end
|
@@ -24,6 +24,33 @@ module DataMapper
|
|
24
24
|
yield table
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def delete(table)
|
29
|
+
@tables.delete(table.name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def <<(table)
|
33
|
+
@tables[table.name] = table
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_tables_sql
|
37
|
+
@to_column_exists_sql || @to_column_exists_sql = <<-EOS.compress_lines
|
38
|
+
SELECT TABLE_NAME
|
39
|
+
FROM INFORMATION_SCHEMA.TABLES
|
40
|
+
WHERE TABLE_SCHEMA LIKE ?
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_database_tables(schema = "%")
|
45
|
+
tables = []
|
46
|
+
@adapter.connection do |db|
|
47
|
+
command = db.create_command(to_tables_sql)
|
48
|
+
command.execute_reader(schema) do |reader|
|
49
|
+
tables = reader.map { @adapter.class::Mappings::Table.new(@adapter, reader.item(0)) }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
tables
|
53
|
+
end
|
27
54
|
|
28
55
|
end
|
29
56
|
|