This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'dm-core' | |
# DataMapper.setup(:legacy, "sqlite3:///#{Dir.pwd}/legacy.db") | |
# DataMapper.setup(:new, "sqlite3:///#{Dir.pwd}/new.db") | |
DataMapper.setup( :legacy, | |
:adapter => "mysql", | |
:encoding => "utf8", | |
:database => "dm_legacy", | |
:username => "root", | |
:host => "localhost" ) | |
DataMapper.setup( :new, | |
:adapter => "mysql", | |
:encoding => "utf8", | |
:database => "dm_new", | |
:username => "root", | |
:host => "localhost" ) | |
module DataMapper | |
module Types | |
class LegacyBlogId < DataMapper::Type | |
primitive String | |
def self.load(value, property) | |
case value | |
when 'en' | |
1 | |
else | |
2 | |
end | |
end | |
end | |
end | |
end | |
class LegacyArticle | |
include DataMapper::Resource | |
storage_names[:legacy] = 'articles' | |
property :id, Serial | |
property :text, Text | |
property :title, String, :length => 255 | |
property :language, String, :default => "en" | |
property :created_on, DateTime | |
end | |
class NewArticle | |
include DataMapper::Resource | |
storage_names[:new] = 'items' | |
property :id, Serial | |
property :body, Text | |
property :main_title, String, :length => 255 | |
property :blog_id, Integer, :default => 1 | |
property :created_at, Date | |
property :created_on, DateTime | |
property :author_id, Integer, :default => 1 | |
end | |
class Article | |
include DataMapper::Resource | |
storage_names[:legacy] = 'articles' | |
storage_names[:new] = 'items' | |
property :id, Serial | |
property :body, Text | |
property :title, String | |
property :created_on, DateTime | |
property :created_at, DateTime | |
property :author_id, Integer | |
property :blog_id, Integer | |
repository(:legacy) do | |
property :body, Text, :field => "text" | |
property :blog_id, LegacyBlogId, :field => "language" | |
property :created_at, DateTime, :field => "created_on" | |
# property :author_id Skip | |
end | |
repository(:new) do | |
property :title, String, :field => "main_title" | |
end | |
# quick hack to avoid yet another DM bug | |
def to_hash | |
property_hash = {} | |
Article.properties.defaults.map{|property| property_hash[property.name] = self.send(property.name)} | |
property_hash.except(:id) | |
end | |
# Monkey patch the copy method to work | |
def self.copy(source, destination, query={}) | |
repository(destination) do | |
repository(source).read_many(DataMapper::Query.new(repository(source), self, query)).each do |resource| | |
self.create(resource.attributes.except(:id)) | |
end | |
end | |
end | |
end | |
# Load some data in the legacy repo | |
repository(:legacy) do | |
LegacyArticle.auto_migrate! | |
LegacyArticle.create(:text => "this is a legacy body", :title => "this is the title", :language => "fr", :created_on => Time.now) | |
LegacyArticle.create(:text => "this is another legacy body", :title => "this is another title", :created_on => Time.now) | |
puts "legacy articles created" | |
end | |
# Load some data in the new repo | |
repository(:new) do | |
NewArticle.auto_migrate! | |
NewArticle.create(:body => "this is a new body", :main_title => "this is the title", :blog_id => 1, :created_on => Time.now, :created_on => Time.now) | |
NewArticle.create(:body => "this is another new body", :main_title => "this is another title", :blog_id => 2, :created_on => Time.now, :created_on => Time.now) | |
puts "new articles created" | |
end | |
begin | |
Article.copy(:legacy, :new) | |
rescue Exception => e | |
puts "Boo Model#copy didn't work! #{e}" | |
else | |
puts "Model#copy worked fine" | |
end | |
begin | |
old_article = repository(:legacy) { Article.first } | |
new_article = repository(:new) { Article.first } | |
fresh_article = repository(:new) { Article.new } | |
fresh_article.attributes = old_article.to_hash | |
repository(:new) { fresh_article.save } | |
rescue Exception => e | |
puts "new object with legacy attributes failed #{e}" | |
else | |
puts fresh_article.attributes.inspect | |
puts "new object with legacy attributes worked fine!" | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment