From fce13b84fe29c23c4afffe1ea11a765c77e603b1 Mon Sep 17 00:00:00 2001 From: Jordan Ritter Date: Thu, 8 Sep 2011 22:19:51 -0700 Subject: [PATCH] Fix bug related to migrating custom types derived from builtin types. 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. --- lib/dm-migrations/adapters/dm-do-adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dm-migrations/adapters/dm-do-adapter.rb b/lib/dm-migrations/adapters/dm-do-adapter.rb index 56609ed..2803c51 100644 --- a/lib/dm-migrations/adapters/dm-do-adapter.rb +++ b/lib/dm-migrations/adapters/dm-do-adapter.rb @@ -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]