Skip to content
This repository has been archived by the owner on Apr 17, 2018. It is now read-only.

Commit

Permalink
Fix bug related to migrating custom types derived from builtin types.
Browse files Browse the repository at this point in the history
When dm-migrations' dm-do-adapter runs, Adapter#property_schema_hash is invoked
on each property to generate the SQL for it.

For Property::Text, type_map[Property::Text] yields a schema of TEXT with no
:length property.  When DM encounters a String primitive whose length exceeds
the schema's capacity, it auto-adjusts the schema primitive to compensate
(i.e. in MySQL, {SHORT,MEDIUM,LONG}TEXT).  Result: MEDIUMTEXT == AWESOME.

The case is different for (1) a custom Property derived from (2) a builtin
Property whose schema primitive changes based on the Property's size options.
For Property::Json, the first type_map[property.class] lookup is nil because
custom types can't/don't update Adapter#type_map -- custom properties can't know
what model/repository/adapter they're going to be on at definition time, which
they would need because the type_map is stored on the adapter *class*.

So, the second lookup type_map[property.primitive] kicks in, which for
Property::Json is type_map[String].  That in turn yields a schema of VARCHAR
with a :length property.  As with Property::Text, when DM encounters a String
primitive whose length exceeds the schema's capacity, it auto-adjusts the schema
primitive to compensate (i.e. in MySQL, {SHORT,MEDIUM,LONG}TEXT).  However, when
dm-migrations encounters any property_schema_hash with a :length option, it
automatically appends "(%i)" % length to the SQL statement.  Result:
MEDIUMTEXT(123412341234) == entire migration FKD.
  • Loading branch information
jpr5 committed Sep 9, 2011
1 parent abf0283 commit fce13b8
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion lib/dm-migrations/adapters/dm-do-adapter.rb
Expand Up @@ -198,7 +198,7 @@ def property_schema_hash(property)
primitive = property.primitive
type_map = self.class.type_map

schema = (type_map[property.class] || type_map[primitive]).merge(:name => property.field)
schema = (type_map[property.class] || type_map[property.class.superclass] || type_map[primitive]).merge(:name => property.field)

schema_primitive = schema[:primitive]

Expand Down

0 comments on commit fce13b8

Please sign in to comment.