
Property declarations should raise for unsupported types
Reported by Kevin Bullock | January 4th, 2008 @ 10:16 AM
Hello—
I've been playing around with Merb+DataMapper to create a cheapo little blog, and ran into the following error while loading a Post (which has a created_at) up from the database:
>> Post.new(:title => 'Foo', :text => 'Bar').save
=> true
>> Post.first
DataMapper::MaterializationError: Failed to materialize column :created_at with value "2008-01-04 10:03:37"
undefined method `type_cast_timestamp' for #<DataMapper::Adapters::MysqlAdapter:0x18832f8>
(eval):2:in `type_cast_value'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:62:in `materialize'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:54:in `each_pair'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:54:in `materialize'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:248:in `load'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:247:in `each_pair'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:247:in `load'
/Library/Ruby/Gems/1.8/gems/do_mysql-0.2.3/lib/do_mysql.rb:132:in `each'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:246:in `load'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:223:in `call'
/Library/Ruby/Gems/1.8/gems/do_mysql-0.2.3/lib/do_mysql.rb:180:in `execute_reader'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:219:in `call'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:77:in `connection'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/support/connection_pool.rb:67:in `hold'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:77:in `connection'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:216:in `call'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:321:in `load'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/context.rb:44:in `first'
/Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/support/active_record_impersonation.rb:53:in `first'
(irb):15:in `irb_binding'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/irb/workspace.rb:52
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:65:in `materialize'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:54:in `each_pair'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:54:in `materialize'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:248:in `load'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:247:in `each_pair'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:247:in `load'
from /Library/Ruby/Gems/1.8/gems/do_mysql-0.2.3/lib/do_mysql.rb:132:in `each'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:246:in `load'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:223:in `call'
from /Library/Ruby/Gems/1.8/gems/do_mysql-0.2.3/lib/do_mysql.rb:180:in `execute_reader'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:219:in `call'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:77:in `connection'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/support/connection_pool.rb:67:in `hold'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:77:in `connection'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/sql/commands/load_command.rb:216:in `call'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/adapters/data_object_adapter.rb:321:in `load'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/context.rb:44:in `first'
from /Library/Ruby/Gems/1.8/gems/datamapper-0.2.5/lib/data_mapper/support/active_record_impersonation.rb:53:in `first'
from (irb):15>>
As you can see, the model saves fine, but fails to load back up. Here's the model:
class Post < DataMapper::Base
belongs_to :section
has_many :comments
property :title, :string
property :text, :text
property :created_at, :timestamp
validates_length_of :title
validates_presence_of :text
end
Pretty standard, as you can see.
I also can't set the created_at property on an object. No exception is raised, it just silently fails. Is timestamp column support just not yet implemented?
I'm using DataObjects.rb, DataMapper, and Merb all from svn trunk (DO.rb from rubyforge.org svn).
Comments and changes to this ticket
-
Sam Smoot January 4th, 2008 @ 05:51 PM
- Milestone cleared.
- State changed from new to open
- Title changed from Can't load object with timestamp column to Property declarations should raise for unsupported types
It's :datetime, not :timestamp.
But this does raise an important point... property declarations should raise errors for unsupported types. As well as probably telling you what the supported types are for convenience.
-
Sam Smoot January 4th, 2008 @ 05:52 PM
PS: This should probably happen (the raising for invalid types) in Property#initialize or something.
-
Kevin Bullock January 4th, 2008 @ 08:03 PM
I was aware of the :datetime type. I had thought, though, that there would be support for the TIMESTAMP type in MySQL, which is separate from DATETIME. If that's not the case (it has dubious and ever-changing semantics anyway), I'll work on a patch to raise an error.
-
-
Sam Smoot January 5th, 2008 @ 01:19 AM
Patch looks good to me. The only tweak I might make is to use #has_key? instead of #[] lookup.
Kevin: So what's the difference between datetime and timestamp anyways? Is it significant enough to warrant support?
-
Sam Smoot January 5th, 2008 @ 01:20 AM
Oh yeah, and a corresponding spec in property_spec.rb would be nice. ;-)
You can search for project for "raise_error" to find an example of how to test for an error with RSpec.
-
Kevin Bullock January 5th, 2008 @ 09:28 AM
Yeah, I spent some time learning the basics of RSpec last night in the interest of writing a spec :) I'll try to post one later today.
In MySQL, the DATETIME type is the more general one, and seems equivalent to PostgreSQL's timestamp type. The MySQL TIMESTAMP is basically equivalent to a Unix timestamp, i.e. the range is from 1970-01-01 00:00:00 to sometime in 2038, when 32-bit integer overflow occurs.
A TIMESTAMP column can also be auto-set on insert and update to the current time. This gets at the same functionality as the magic properties (created_at, etc.), so I'm not sure if DataMapper really needs to support it.
More detail here:
http://dev.mysql.com/doc/refman/...
and especially here:
-
Kevin Bullock January 5th, 2008 @ 11:50 AM
Okay, got an updated patch here, with spec. I didn't know you could actually define a class within a lambda, but it works!
-
Kevin Bullock January 5th, 2008 @ 11:55 AM
Whoops, one more version of the patch, this time switched to #has_key? instead of #[]. Attaching unsupported_types_2.patch.
-
Bernerd Schaefer January 6th, 2008 @ 09:29 AM
- State changed from open to resolved
I applied the patch. Thanks Kevin!
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »