datamapper 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|